rs232 antwortet nicht :-(
-
hallo,
ich vor ca. 4 Jahren etwas in C++ geproggt, nämlich mit rs232 senden und empfangen,das ging ziehmlich gut
jetzt möchte ich das gerne wieder tun blos mit einem anderem Sendecode

Mein Ziel ist nichts anderes wie die Hexzahlen:
02 03 04 01 05 06 15
mit der Einstellung
9600 Bautrate
1 Stopbit
8 Byte
0 Fusspunkt
0 Paritydreck
an die Rs232 zusenden, als antwort bekomme ich 21 Byte, nicht mehr und nicht weniger.
...und das alles per 2 Kopfe (verbinden und 7 Byte zu senden) und ein Editkonlltrolle(um 21 Byte zu empfangen )

meine Definition:
HANDLE h_comtwo; //Comport handle DCB dcb; //datenbankstrucktur CString weiter; //zwischenstring int bytelaenge; //bytelänge int wbytelaenge; // ermittelts länge unsigned char cData[1]; //sende empfang DWORD dwCount,up,down; // " int rbytelaenge; // " int wert[100]; // "mein umrechner:
CString dezhex(int zahl) { int dez,erste,zweite; CString one,two,antwort,str; dez = zahl; erste = dez % 16; switch(erste) { case 0: erste= '0'; one = "0"; break; case 1: erste= '1'; one = "1"; break; case 2: erste= '2'; one = "2"; break; case 3: erste= '3'; one = "3"; break; case 4: erste= '4'; one = "4"; break; case 5: erste= '5'; one = "5"; break; case 6: erste= '6'; one = "6"; break; case 7: erste= '7'; one = "7"; break; case 8: erste= '8'; one = "8"; break; case 9: erste= '9'; one = "9"; break; case 10: erste= '10'; one = "A"; break; case 11: erste= '11'; one = "B"; break; case 12: erste= '12'; one = "C"; break; case 13: erste= '13'; one = "D"; break; case 14: erste= '14'; one = "E"; break; case 15: erste= '15'; one = "F"; break; } zweite = dez/16; switch(zweite) { case 0: zweite= '0'; two = "0"; break; case 1: zweite= '1'; two = "1"; break; case 2: zweite= '2'; two = "2"; break; case 3: zweite= '3'; two = "3"; break; case 4: zweite= '4'; two = "4"; break; case 5: zweite= '5'; two = "5"; break; case 6: zweite= '6'; two = "6"; break; case 7: zweite= '7'; two = "7"; break; case 8: zweite= '8'; two = "8"; break; case 9: zweite= '9'; two = "9"; break; case 10: zweite= '10'; two = "A"; break; case 11: zweite= '11'; two = "B"; break; case 12: zweite= '12'; two = "C"; break; case 13: zweite= '13'; two = "D"; break; case 14: zweite= '14'; two = "E"; break; case 15: zweite= '15'; two = "F"; break; } antwort = two; antwort += one; return antwort; }Der Verbindungsknopf:
UpdateData(TRUE); h_comtwo=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); // GetCommState(h_com, &dcb); //GetCommState(h_com, &dcb_neu); // GetCommTimeouts(h_com,&cto); //GetCommTimeouts(h_com,&cto_neu); dcb.DCBlength = sizeof(dcb); dcb.BaudRate = 9600; // Baudrate dcb.StopBits = ONESTOPBIT; dcb.Parity = NOPARITY;// Kein Paritybit dcb.ByteSize = 8; // 8 Datenbits m_log += "Verbindung zu Comport wurde hergestellt"; m_log += "\r\n"; UpdateData(FALSE); }Senden:
UpdateData(TRUE); //////////Bytelänge ermitteln...////////////////////////// weiter = "02 03 04 01 05 06 15"; weiter += "z "; for(bytelaenge = 0;bytelaenge<100;bytelaenge++) { if(weiter[bytelaenge] == 'z') { wbytelaenge = bytelaenge; } } ///////////////////////////////////////////////////////////////////////// ////////////////// mache jetzt eine leerstelle byte byte leer /////////// wbytelaenge++; for(int i=0;i<bytelaenge;i+=3) { wert[i/3] = ((isalpha(weiter[i])?( toupper(weiter[i])-55):weiter[i]-48)*16) + (isalpha(weiter[i+1])?( toupper(weiter[i+1])-55):weiter[i+1]-48); } ///////////////////////// Sendekram ///////////////////////////////// ///////////////////////////////////////////////////////////////////// int byte; wbytelaenge = wbytelaenge / 3; for (byte = 0; byte <wbytelaenge; byte++) { cData[0] = wert[byte]; WriteFile(h_comtwo,&cData,1,&up,0); } ////////////////////// empfangsdaten //////////////////////////////// ///////////////////////////////////////////////////////////////////// Sleep(250); // erst mal in den Müll !!!!!!!!!!!!!!!!!!!!! ReadFile(h_comtwo,&cData,1,&down,0); m_log += dezhex(cData[0]); m_log += "\r\n"; UpdateData(FALSE); UpdateData(FALSE); }soweit so gut, wenn ich ein Nullmodemkabel an einen anderen Rechner anschließe, bekomme ich den Sendekram auf dem Monitor angezeigt.sprich das geht

Zum Problem:wenn ich ein 1 zu 1 Kabel an eine spezielle Hardware anschließe bekomme ich keine Antwort, sprich mein Programm blockiert, zum testen habe ich mir mal gedacht, ich nehme mal 1 Byte, und wenn das geht mache ich eine Vorschleife, aber ich bekomme keine Antowrt von der Hardware die am Com1 hängt.Mit dem RS 232 Super Termialpog (20 Tage Probleversion) kann ich 7 Byte an die spziele Hardware senden, das bekomme ich 21 Byte zurück.
PS:Ich arbeite mit Visual 2003 C++
-
Warum benutzt Du nicht eine fertige, getestete Klasse für die Serial Komm.
Kann ich nur empfehlen:
http://www.codeproject.com/KB/system/serial.aspx
-
ok thx,
ich würde Wochen brauchen um das alles zuverstehen.
Ich wollte einfach nur 7 Byte senden und dann 1 Byte von 21 Byte empfangen und darstellen, mit der Einstellung 9600 Baut, 8 Byte, 1 Stop und kein Parity.kann mit jemand ein einfaches Beispiel machen oder kennt jemand ein einfaches Beispiel.
mfg tom
-
Das hier ist zwar Pascal, aber eines der kürzesten Beispiele, die ich kenne.
Ganz allgemein sollte man alle Einträge im DCB zuweisen, oder ansonsten BuildCommDCB verwenden.
In deinem Code taucht auch nirgendwo ein SetCommState oder ein SetupComm auf ...
Verwendest du den DCB überhaupt irgendwo ?
-
tomycat2009 schrieb:
ok thx,
ich würde Wochen brauchen um das alles zuverstehen.
Ich wollte einfach nur 7 Byte senden und dann 1 Byte von 21 Byte empfangen und darstellen, mit der Einstellung 9600 Baut, 8 Byte, 1 Stop und kein Parity.kann mit jemand ein einfaches Beispiel machen oder kennt jemand ein einfaches Beispiel.
mfg tom
In dem von mir referenzierten Codeproject Artikel gibts ein Bsp... musst nur genug weit runter scrollen.
Simon
-
ok,dann neme ich den sauren Apfel

http://www.codeproject.com/KB/system/serial.aspx <-runtergeladen
Dann habe ich die fette Serial.cpp in mein Projekt eingefügt und die HalloWelt in meinen Knopf reingefummel

erster Test, ok hallo Welt kommt auf dem anderen PC an übers Nullmodem.
Jetzt kommt der Knackpunkt.
Ich möchte gerne den Hexwert 30 übertragen als Hex und nicht als Ascii.lLastError = serial.Write("Hello world\n");in
lLastError = serial.Write(30);Dann kommt..
error C2664: 'WriteFile' : cannot convert parameter 2 from 'int' to 'LPCVOID'ok,zurückgestellt, genauso kann ich schreiben....
... if (!::WriteFile(m_hFile,"halloWelt",iLen,pdwWritten,lpOverlapped)) ...leider geht nicht...
if (!::WriteFile(m_hFile,30,iLen,pdwWritten,lpOverlapped))error C2664: 'WriteFile' : cannot convert parameter 2 from 'int' to 'LPCVOID'
der link der Bibiotek
-
z.B. so:
const size_t len = 1; unsigned char buf[len] = {}; buf[0] = 0x30; serial.Write(buf, len);oder so:
unsigned char val = 0x30; serial.Write(&val, 1);Simon
-
ok,thx.
ich habe jetzt den Fehler gefunden
ich muss die 7 Byte in einem Rutsch senden und nicht einzeln per forschleifeein Problem gelöst und es kommt ein neues,ich klicke auf Verbinden und dann auf senden, das geht ohne Probleme, alles wird im Log Fenster angezeigt, soweit so gut.Ok, ich mache einen Neustart, ich klicke auf Verbinden, das geht und dann auf senden, Programm gestrützt ab.Wenn ich dann per Taskmanager zwangsbeende und dann den Com Tester starte und wieder beende, dann geht mein Prog, bis zum nächsten Neustart.
Der knopf Verbinden...
UpdateData(TRUE); h_comtwo=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); dcb.DCBlength = sizeof(dcb); dcb.BaudRate = 9600; // Baudrate dcb.StopBits = ONESTOPBIT; dcb.Parity = NOPARITY;// Kein Paritybit dcb.ByteSize = 8; // 8 Datenbits m_log += "Verbindung zu Comport wurde hergestellt"; m_log += "\r\n"; m_log += "\r\n"; UpdateData(FALSE);der Knopf senden...
buf[0] = 0x23; //1 buf[1] = 0x50; //2 buf[2] = 0x03; //3 buf[3] = 0x09; //4 buf[4] = 0x00; //5 buf[5] = 0x00; //6 buf[6] = 0x7f; //7 WriteFile(h_comtwo,&buf,7,&up,0); Sleep(50); m_log += "...Die Antwort vom Radio "; if(allesok)//////// check ////////// { allesok = ReadFile(h_comtwo,&cData,21,&down,0); m_log += dezhex(cData[0]); m_log += dezhex(cData[1]); m_log += dezhex(cData[2]); m_log += dezhex(cData[3]); m_log += dezhex(cData[4]); m_log += dezhex(cData[5]); m_log += dezhex(cData[6]); m_log += dezhex(cData[7]); m_log += dezhex(cData[8]); m_log += dezhex(cData[9]); m_log += dezhex(cData[10]); m_log += dezhex(cData[11]); m_log += " "; m_log += dezhex(cData[12]); jb = cData[12]; m_log += " "; m_log += dezhex(cData[13]); m_log += dezhex(cData[14]); m_log += dezhex(cData[15]); m_log += dezhex(cData[16]); m_log += dezhex(cData[17]); m_log += dezhex(cData[18]); m_log += dezhex(cData[19]); m_log += dezhex(cData[20]); UpdateData(FALSE);Ich bin für jeden Tip 1000 mal dankbar.
-
Du musst die DCB Struktur *komplett* setzen!
-
Kann ich bitte dein Code haben ???ich stecke im gleichen Dreck seit einer Woche!!!
möchte auch ein Packet mit 7 bytes Senden, bekomme immer was komisches zurück und wird auch was komisches gesendet!!! ich bin ratlos waoran das liegen kann!! ich hab die bytes dezimal und hexadezimal gesendet, hat einfach nichts gebracht!!
ich bin für jede Hilfe sehr dankbar