Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » String senden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.04.2007, 10:43 Uhr
dozent



Hallo Leute!

Ich habe mal folgendes Problem. Ich möchte einen String vom PC zum µC senden. Wenn ich das ganze mit HyperTerminal mache, das heißt etwas eigeben und enter drücken-> geht wunderbar. Wenn ich es mit meinem Program mache ( in einem Editfenster und OK drucken) tut sich gar nichts. Der "OK-Button" wird nicht als Enter verarbeitet und es wird nichts gesendet. Wenn ich dann komischerweise den HyperTerminal wieder einschalte und nur enter drucke dann wird mein String gesendet. Wie kann ich den Button so programieren, dass er den String aus meinem Editfenster sendet? Ich hoffe ich hab mein Problem deutlich erklärt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.04.2007, 11:41 Uhr
mmc20
puss in boots


hi, ich vermute mal du überträgst seriell ?!

zeig mal etwas code, zumindest den der den OK-button behandelt, sonst könn' wir hier nur raten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.04.2007, 12:09 Uhr
dozent



Das ist die Methode -Senden

C++:
//---------------------------------------------------------------------------
void TFormTransmitt::SendAnsi(AnsiString Send)
{
  for (int i=0;i<Send.Length();i++)
  {
    SendChar(Send.SubString(i+1,1).c_str());
  }
}




ungefähr so sieht mein OK-Button aus ( bin gerade auf der Arbeit, schreibe nach Gedächniss)


C++:
void TFormTransmitt::UebernehmenClick()
{
   AnsiString date;
   char temp[20];
   temp=DateToStr(DateTimePicker->Date);
   strcpy(temp, date.c_str());
   SendAnsi(temp);
}



So ungefähr sieht es aus, wobei meine Sende-Methode hier falsch sein könnte. Das prinzip ist so, dass ich das Datum aus einem DateTimePicher auslese -> in einen String umwandele-> sende über RS232.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.04.2007, 12:23 Uhr
mmc20
puss in boots


mh,

was genau macht "SendChar(...)" (sag jetzt nicht das es ein char sendet...),
ist die COM geöffnet ? wenn ja, mit den richtigen einstellungen ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.04.2007, 12:41 Uhr
dozent



Öffen der RS232

C++:
bool TFormTransmitt::OpenPort(char* port)
{
//RS232 schnittstelle öffnen – bei port „COM1“ „COM2“ oder so eintragen je nachdem copy & paste

  try{
      comm=CreateFile(port,
                      GENERIC_READ|GENERIC_WRITE,
                      FILE_SHARE_DELETE,
                      NULL,
                      OPEN_EXISTING,
                      FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE,
                      NULL
                      );
      }
  catch(...){return false;};
  if(GetLastError()) return false;

  PortOpen=true;
  return true;
}

void TFormTransmitt::SetSerial()
{
  Geschwindigkeit etc. einstellen

  GetCommState(comm,&OriginalDCB); // Original einstellungen speichern
  MyDCB.DCBlength=sizeof(DCB);
  MyDCB.BaudRate=9600;
  MyDCB.ByteSize=8;
  MyDCB.Parity=NOPARITY;
  MyDCB.StopBits=ONESTOPBIT;
  SetCommState(comm,&MyDCB);// setzen der Daten
}





Hier ist die SendChar-Methode

C++:
void TFormTransmitt::SendChar(char *c)
{
  unsigned long CE=0;
  WriteFile(comm,c,1,&CE,NULL);
  //TransmitCommChar(comm,*c);
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.04.2007, 18:23 Uhr
0xdeadbeef
Gott
(Operator)


Das alles hat mit Standard-C(++) wenig zu tun, also -->

Wenn ich ne wilde Vermutung anstellen sollte, würd ich sagen, der String wird bereits zum Senden vorgehalten, aber noch nicht gesendet. In dem Fall müsste man den output stream flushen - in ANSI-C mit nem FILE* wär das

C++:
fflush(comm);


...allerdings weiß ich jetzt nicht, was CreateFile da zurückgibt - könnte ein HANDLE irgendeiner Art sein. Durchsuch mal das WinAPI nach FlushFile oder was vergleichbarem.

Die andere Möglichkeit ist, dass der String gesendet, aber noch nicht vom Controller verarbeitet wird, weil dem das OK fehlt - gut möglich, dass das Hyperterminal ein Steuerzeichen mitsendet, das dem Controller sagt "So, jetzt haste die komplette Anweisung, mach mal." So würde ich das zumindest aufziehen, um zu verhindern, dass der mir irgendwelchen Blödsinn macht. Wenn das der Fall ist, schau dir die Spezi des µC an, da wird das im Zweifel drinstehen, und schick das Steuerzeichen am Ende mit.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 04.04.2007 um 18:24 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.04.2007, 19:45 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
Hyperterminal (=telnet) sendet standardmäßig am Ende \r\n als Befehlesende - evtl wartet der µC so lange bis er das empfängt.

flushen ist normalerweise da nicht nötig, das macht Windows bei Ports automatisch nach jedem Write.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: