Datenverlust bei Kommunikation über RS232
-
Hall ich bins malwieder,
und meine Datenübertragung über Serielle Schnittstelle bereitet mir immernoch Probleme.
Die Übertragung ansich habe ich jetzt endlich hinbekommen. Leider verliere ich nur ein Teil der Daten.
wenn ich mein Char-Aray sende und ein Elemente in MSB eine 1 stehen hat, so geht dieses beim empfangen verloren.
So wird also aus:0x9A (Binär 10011010) eine 0x1A (Binär 11010) oder
0x90 (Binär 10010000) eine 0x10 (Binär 10000)Ich habe auch schon versucht ein unsigned char Array zu nehmen, aber das hat leider auch nicht funktioniert.
Hoffe mich kann jemand einen Tipp geben.
Gruß Kiki
-
überprüf mal die einstellungen beider seiten, also start/stopbits anzahl datenbits usw. bestimmt haste da 'ne differenz...
-
Poste doch bitte mal den entsprechenden Code, sonst könnt ich ja auch sagen:
Meine Daten verändern sich immer, woran kann das liegen?
Edit: Was net grade postete, scheint das Problem zu sein. Das oberste Bit ist immer gelöscht.
-
nee leider nicht, verwende auf beiden Seiten dasselbe Programm.
(habe zur Zeit ne Verbindung über Null-Modem-Kabel)Edit:
//für COM Port int baudrate=9600; char portnr_c= '1'; // stores COM-Port number char databits_c = '8'; // stores number of data bits char stopbits_c = '1'; // stores number of stop bits char paritbit_c = '0'; // stores type of parity bit char protocol_c = '0'; // stores protokol type bool open_com_b = false; // set if COM opened bool par_enable_b = false; // flag if parity is enabled ... #include "S_Kommunikation.h" #include "Eingabefenster.h" #include <iostream.h> #include <windows.h> #include <conio.h> HANDLE com_status_h; extern char portnr_c; // stores COM-Port number extern int baudrate; // stores baudrate extern char databits_c; // stores number if data bits extern char stopbits_c; // stores number of stop bits extern char paritbit_c; // stores type of parity bit extern char protocol_c; // stores protokol type extern bool par_enable_b; // flag if parity is enabled extern bool open_com_b; // flag if COM is open extern char InString[22]; //extern DWORD dwRead; //--------------------------------------------------------------------------- int Open_Comport() { AnsiString temp="COM"+IntToStr(portnr_c); DCB dcb; com_status_h = CreateFile ("COM1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); // setzen der Blocklaenge, muss erfolgen-------------------------- dcb.DCBlength = sizeof(DCB); // COM-Einstellungen laden---------------------------------------- GetCommState (com_status_h, &dcb); // Baudrate einstellen------------------------------------------- dcb.BaudRate = baudrate; // Datenbits einstellen------------------------------------------- dcb.ByteSize = databits_c; // Paritaet einstellen-------------------------------------------- dcb.Parity = paritbit_c; // Stopbits einstellen-------------------------------------------- dcb.StopBits = stopbits_c; if (par_enable_b) dcb.fParity = 1; else dcb.fParity = 0; if (protocol_c == 0x00) dcb.fDtrControl = DTR_CONTROL_ENABLE; else dcb.fDtrControl = DTR_CONTROL_DISABLE; // COM-Einstellungen speichern------------------------------------ SetCommState (com_status_h,&dcb); if (com_status_h == 0) // error in opening port { Befehlsauswahl->StatusBar->Panels->Items[0]->Text = "COM" + IntToStr(portnr_c) +" konnte nicht geöffnet werden!"; open_com_b=false; } else { Befehlsauswahl->StatusBar->Panels->Items[0]->Text = "COM" + IntToStr(portnr_c) +" wurde erfolgreich geöffnet!"; } return 0; } //--------------------------------------------------------------------------- int Close_Comport(void) { CloseHandle (com_status_h); return (0); } //--------------------------------------------------------------------------- void Write_Comport(char b_daten[22],int length) { Open_Comport(); char temp[22]=""; for(int i=0;i<length;i++) temp[i]=b_daten[i]; DWORD iBytesWritten; WriteFile(com_status_h,&temp,23,&iBytesWritten,NULL); if(iBytesWritten == (unsigned int)length) Befehlsauswahl->StatusBar->Panels->Items[0]->Text="Übertragung erfolgreich!"; else Befehlsauswahl->StatusBar->Panels->Items[0]->Text="Übertragung nicht erfolgreich!"; Close_Comport(); } //--------------------------------------------------------------------------- void Read_Comport() { Open_Comport(); Befehlsauswahl->StatusBar->Panels->Items[0]->Text="Empfangsmodus gestartet."; Befehlsauswahl->StatusBar->Update(); int i=0; bool empfangen=false; while(!empfangen && i<50) { DWORD dwRead=0; ReadFile (com_status_h, &InString, sizeof (InString), &dwRead, NULL); if(dwRead > 0) { empfangen=true; } Sleep(200); i++; } if(empfangen) Befehlsauswahl->StatusBar->Panels->Items[0]->Text="Empfangsmodus beendet."; else Befehlsauswahl->StatusBar->Panels->Items[0]->Text="Empfangsmodus beendet. (Es wurden keine Daten empfangen.)"; Close_Comport(); } //---------------------------------------------------------------------------
-
Da würd ich mal versuchen, erstmal per Hyperterminal zu empfangen. Da kannst du zunächst mal prüfen, ob denn die Daten richtig versendet wurden.
-
ja also daten übertragen kann ich auf jeden Fall, auch mit einem Terminal.
Das Problem ist halt, dass ich bei meinem Terminal nur Buchstaben empfangen kann. Komm ich da auch irgendwie an die Hexwerte ran?Edit:
Also jetzt ist was komisches passiert, nachdem ich die Daten nochmal von einem PC an einen anderen geschickt habe (aber an das Terminal) hat es funktioniert. Und jetzt funktioniert auch die Übertragung von einem Programm zum anderen.
Kann mir des jemand erklären??? Will halt nicht, dass so en Fehler später nochmal auftritt!