Serielle Datenübertragung mit C++
-
Hallo zusammen,
folgendes Problem. Möchte aus C++ ein Zeichen an einen µ-Controller senden. Dieser soll dann Antworten, dass er das Zeichen erhalten hat. Dies soll über die RS232 Schnittstelle passieren, welche an den Controller angeschlossen ist. Der Controller soll nur ein Zeichen erhalten, auf welches hin er dann seine Software startet. Weiss jemand wie das geht? Habe in der C++ Hilfe nichts darüber gefunden.Ich danke schon mal im Voraus,
Gruß
schmiggy
-
Da musst die Schnittstellen des Betriebssystems benutzen.
Bei Windows z.B. siehe Platform SDK Dokumentation, guck auch mal ins WinAPI Forum hier.
Bei Linux geht das ueber open()/close()/read()/write()/fcntl()/ioctl() -- siehe Linux Forum hier.
-
Soll für Windows sein.
Gibt es nicht einfach einen Befehl, der einen Char über die serielle Schnittstelle an einen Empfänger sendet?
Bin noch Programmier-Neuling und habe auch das nötige Fachwissen noch nicht, was die Sache für mich logisch erscheinen lässt... .Muss die Schnittstelle noch initialisiert werden?
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Guck mal hier:
-
Danke erstmal, die Library ist ist ja echt super umfangreich.
Werde ich gleich ausprobieren.Gruß
-
So unterhalte ich mich mit dem Mikrocontroller:
//Initialisieren void __fastcall TForm1::FormCreate(TObject *Sender) { ReturnedHandle = CreateFile(//As per Win32 help ! "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL ); // GetCommTimeouts(ReturnedHandle,&timeoutold); timeoutold.ReadIntervalTimeout=MAXDWORD; timeoutold.ReadTotalTimeoutConstant=1000; timeoutold.ReadTotalTimeoutMultiplier=1; timeoutold.WriteTotalTimeoutConstant=1000; timeoutold.WriteTotalTimeoutMultiplier=1; char acdef[255]; strcpy(acdef,"baud=28800 parity=N data=8 stop=1 "); if(BuildCommDCB(acdef,&lpdcb)==FALSE) {Systemmeldung();} if(SetCommState(ReturnedHandle,&lpdcb)==FALSE) {Systemmeldung();} if(SetCommTimeouts(ReturnedHandle,&timeoutold)==FALSE) {Systemmeldung();} else{}; /******* Senden ***********************************************************/ void senden( uchar* puffer, DWORD len,HANDLE hFile){ DWORD buff; for (int i=1;i<(len-1);i++) puffer[len-1]+=puffer[i]; if(WriteFile(hFile,puffer,len, &buff,NULL)==FALSE) { Systemmeldung(); } } /******* lesen(): Zentrale Leseroutine: Angabe: wiviel Bytes und wohin * Lesen von uint typ, len Bytes nach uchar. Letztes Byte ist fcs. * fcs wird nur gelesen wenn len>0, FCS gilt nur fuer DATENblock */ int lesen( unsigned char typ ,unsigned char *dest, DWORD len,HANDLE hFile) { uchar rx_fcs=0; DWORD fguff; //Anzahl geles.Bytes if(ReadFile(hFile,dest, len, &fguff,NULL)==FALSE) { Systemmeldung(); } if (fguff!=len){Application->MessageBox("Fehler beim Empfangen", " Timeout", MB_OK|MB_ICONSTOP); return -1 ; } if(typ!=dest[0]){Application->MessageBox(" Fehler beim Typ ", " Timeout ", MB_OK|MB_ICONSTOP); return -2;} if (len!=1){ for (int i=1;i<(len-1);i++) rx_fcs+=dest[i]; if (rx_fcs!=dest[len-1]){ Application->MessageBox(" Fehler FCS ", " Timeout ", MB_OK|MB_ICONSTOP); return -3 ; } } return 0; /* Ansonst: OK! */ }