COM Signale
-
hallo,
kann mir jemand sagen wie der windows treiber die signale für DTR und DSR
setzt. ich lese daten mit der funktion 'ReadFile' aus deren handle auf den entsp. port zeigt. setzt der treiber die DTR/DSR Singnale dann auf false damit
der gegenüber nichts mehr sendet wenn die funktion beendet ist??hir mal noch code dazu
void __fastcall TCOMLesen::Execute() { FreeOnTerminate = true; LPSTR lpMsgBuf; while(!Terminated) { if (!ReadFile(hComm, InBuff, 1, &dwBytesRead, NULL)) { FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); Application->MessageBox(lpMsgBuf,"Fehler...",MB_OK); } if (dwBytesRead) { InBuff[dwBytesRead] = 0; // NULL TERMINATE THE STRING NCProgramm = NCProgramm + AnsiString(InBuff); Synchronize(Zaehler); } else { if (NCProgramm.Length() > 0) Synchronize(Beenden); } } }
-
das kannst du in der dcb einstellen
-
das mach ich ja, nur hab ich den eindruck das da was nicht geht am treiber.
void __fastcall TCOMPort::COMParameterSetzen(int Baud, int Parity, int DBits, int SBits, int Protokoll, int OutxCtsFlow, int OutxDsrFlow, int DsrSens, int DtrControl, int RtsControl) { GetCommState(hComm, &dcbCommPort); dcbCommPort.DCBlength = sizeof(DCB); dcbCommPort.BaudRate = Baud; dcbCommPort.Parity = Parity; dcbCommPort.ByteSize = DBits; dcbCommPort.StopBits = SBits; switch (Protokoll) { case 1 : break; case 2 : dcbCommPort.fOutX = true; dcbCommPort.fInX = true; break; case 3 : dcbCommPort.fOutxDsrFlow = OutxDsrFlow; dcbCommPort.fDtrControl = DtrControl; dcbCommPort.fDsrSensitivity = DsrSens; dcbCommPort.fOutxCtsFlow = OutxCtsFlow; dcbCommPort.fRtsControl = RtsControl; break; } if (!SetCommState(hComm, &dcbCommPort)) MessageBeep(-1); }
-
mein konkretes problem ist das, ich hab in dem PC ne 4fach serielle Karte.
an der hängen 4 CNC maschinen, zwei von denen laufen ohne protokoll und zwei mit hardware handshake die eine geht nur mit der anderen hab ich ein problem.
ich sende daten und die steuerung liest diese blockweise aus, sobald sie den ersten block ausliest sollte die übertragung kurz stopen und dann wieder weitergehen, tut sie aber nicht. die kabel sind richtig belegt und getestet.
-
ich bin gerade an einem ähnlichen projekt dran.
habe mir auch ne rs232 steuerung auf winapi aufgebaut, da ich mit einem anderem rechner über "testbefehle" komunizieren muss.
am anfang hatte ich probleme, da ca 3 bits an der rs232 auf high stat auf low waren. so sendete der 2 rechner nichts. das habe ich aber mitdcb.fRtsControl=1; dcb.fDtrControl=1;gelöst. du bräuchtest ja genau das umegekehrte (wenn ich es richtig verstanden habe)
dcb.fRtsControl=0; dcb.fDtrControl=0;Frage1: hast du nicht eine relativ hohe CPU-auslastung mit der whileschlaufe?
Frage2:
ich sende daten und die steuerung liest diese blockweise aus, sobald sie den ersten block ausliest sollte die übertragung kurz stopen und dann wieder weitergehen
schnall den satz nicht ganz.. willst du das senden deines programmes unterbrechen? ich denke jetzt mal, du willst das empfangen der daten von der cnc maschine kurz anhalten..
willst du nicht lieber einen "Buffer" machen? ein TString oder ähnliches?
-
BigNeal schrieb:
ich sende daten und die steuerung liest diese blockweise aus, sobald sie den ersten block ausliest sollte die übertragung kurz stopen und dann wieder weitergehen
schnall den satz nicht ganz.. willst du das senden deines programmes unterbrechen? ich denke jetzt mal, du willst das empfangen der daten von der cnc maschine kurz anhalten..
willst du nicht lieber einen "Buffer" machen? ein TString oder ähnliches?sorry hab mich falsch ausgedrück ich will testweise das empfangen der daten auf dem
rechner stoppen. ich hab hier im büro zwei rechner verbunden jetzt hab ich mal en stop in die schleife gesetzt um das auslesen des puffers an der cnc maschinen zu simulieren und um zu schauen od das mit den signalen geht. die cnc maschine hat en puffer von 30 zeichen wenn der voll ist stop sie kurz und liest den mit syntaxprüfung ein.nur weis ich jetzt nich ob die maschinen die signale falsch setzt oder meine sw
die nich verstehen will.
hab aber solangsam diese exsys schnittstellenkarte im verdacht die im pc steckt.Frage1: hast du nicht eine relativ hohe CPU-auslastung mit der whileschlaufe?
doch mir ist nur noch keine bessere lösung eingefallen.
-
wie gesagt, ich arbeite momentan an einem ählichem projekt und habe mit der RS232 abfrage ca 0-1% CPU auslastung
schau dir mal diese funktionen an
OVERLAPPED
WaitForSingleObjectich hatte zwar ne weile bis alles lief wie ich wollte
wenn du willst, kann ich dir sonst auch mein code schicken
schick mir sonst einfach ein mail
michi(at)bigneal(dot)chBigNeal
-
du kannst mir ja mal ein teil vom code posten wenn du willst