Serielle Schnittstelle Com1 ansteuern
-
Vielen Dank für die ausführliche Hilfe.
Sobald ich kann werde ich es ausprobieren.MfG ACU
-
@ Sunday:
Warum gibst du der Fkt.
int SendData(HANDLE hCom, char *Data, int Length)int Length mit, das könnte man doch dann in der Fkt abfragen mit Data.Length() oder strlen(Data).
Oder würde das nicht funktionieren? Warum?
mfg
Tom
-
seit wann hat ein array eine eine funktion Length()? das array weiss doch nicht wie gross es ist.
strlen ermittelt die länge einer zeichenkette und bei binären daten funktioniert das dann nicht mehr, da strlen bis zum ersten \0 zeichen liest.
-
Aber ich übergebe der Fkt doch eh nur ein Element und von diesem Element, in dem mein Text steht, den ich senden will, müsste ich doch die Länge auch direkt herausbekommen. Da müsste es doch egal sein ob ich die Länge vorher über eine Fkt bestimme oder direkt "inline"?
oder, täsuche ich mich, da?
mfg
TomPS: Wie würde deine Fkt aussehen die dann die SendData(....) aufruft?
-
vielleicht solltest du dich noch einmal mit den grundlagen von c/c++ beschäftigen...
const int BufSize = 25; char *Buffer = new char[BufSize]; // Puffer fuellen strcpy(Buffer, "blahfasel dumdidum"); DWORD BytesWritten = SendData(hCom, Buffer, BufSize); // 25 zeichen senden DWORD BytesRead = ReceiveData(hCom, Buffer, BufSize); // 25 zeichen empfangen delete [] Buffer;
-
strcpy(Buffer, "blahfasel dumdidum");Hier hast du doch nen String in Buffer kopiert und wenn ich dann:
strlen(Buffer) mache müsste ich doch die Länge von dem Ding bekommen, oder etwa nicht?StrLen gibt die Anzahl der Zeichen ohne das abschließende Nullbyte eines Strings zurück. -> steht so in der Hilfe.
Also entweder habe ich jetzt nen gewaltigen Denkfehler, dann tuts mir leid, wenn ich lästig war oder ich hab recht dann

mfg
Tom
-
man man man... der string ist doch nur ein beispiel gewesen.
stell dir vor du hast ne kamera an der seriellen schnittstelle haengen, die sendet dir keine strings sondern bilder und die liegen binär vor. diesen enthalten also auch nullbytes bei denen strlen abbrechen würde! deswegen benötigts du die grösse des puffers. die kamera stellt dann z.b. befehle zur verfügung um die grösse eine bildes vor dem transfer abzufragen um entspr. den puffer anzupassen.
capito?!
-
ja, ok, thx, hab nicht beachtet dass es auch möglich ist, dass wie du schon sagst ein NULLBYTE öfters vorkommen kann.
mfg
Tom
-
Ich bins nochmal.
Bei der Funktion zum schließen der Schnittstelle habe ich noch eine Frage, was muß ich als Handle übergeben, damit ich die zuvor geöffnete Com1 wieder schließen kann?void CloseComm(HANDLE hCom) { PurgeComm(hCom, PURGE_RXABORT); CloseHandle(hCom); }MfG ACU
-
ACU schrieb:
Ich bins nochmal.
Bei der Funktion zum schließen der Schnittstelle habe ich noch eine Frage, was muß ich als Handle übergeben, damit ich die zuvor geöffnete Com1 wieder schließen kann?void CloseComm(HANDLE hCom) { PurgeComm(hCom, PURGE_RXABORT); CloseHandle(hCom); }MfG ACU
Das Richtige!
-
Danke für die aufschlußreiche Antwort.
Das ich das Richtige übergeben muß, habe ich mir selber schon fast gedacht.
Weil wenn ich das falsche übergebe, geht es nicht.Aber was ist das Richtige den nun?
ACU
-
Das von CreateFile zurückgegebene Handle.
-
Öffnen und schließen der Schnittstelle funktioniert jetzt.
Ich habe aber noch ein paar kleine Probleme.
Zum Beispiel funktioniert die Konfiguration der Schnittstelle nicht.Die Konfiguration rufe ich mit SetDeviceControlBlock(Schnittstelle,9600,8,0,1);auf.
Auch das Senden macht noch Probleme (vielleicht auch wegen der Konfiguration).
Ich möchte eine String mit ASCII Zeichen an die Serielle Schnittstelle senden.
Dazu habe ich folgenden Code verwendet:char *ch = new char[Form1->Edit1->Text.Length()]; strcpy(ch, Form1->Edit1->Text.c_str());int Laenge;
SendData(Schnittstelle,ch,Edit1->Text.Length());[/code]
Empfangen tu ich nur sinnlose Werte, die in Keinster Weise den ASCII werten entsprechen.Wäre toll, wenn jemand helfen könnte.
MfG ACU
-
was hängt denn an deiner seriellen schnittstelle?
einfach was hinsenden und empfangen, geht glaub ich nicht. zumindest mussten irgendwelche pins miteinander verbunden werden (pin 2 und 3?). das machste zum beispiel mit ner büroklammer oder nem anderen stück draht. dann kannste deine eigenen gesendeten daten empfangen...
-
An meiner seriellen Schnittstelle hängt eine C-Control2.
Das ist ein Steuercompter für diverse Steuer und Regel Aufgaben.
Wenn ich per Hyper Terminal sende, funktioniert es tadellos.
Am Anschluß liegt es also nicht-.MfG ACU
-
was liefert den GetLastError fuer ne fehlermeldung?
-
Das mit LeastError probiere ich nachher nochmnal aus.
Die auf seite 2 von mir geposteten Quellcodeauszuäge sind aber grundsätzlich richtig oder?
Nicht das bei der Umwandlung in char oder so schon der Fehler sitzt.Die Konfiguration für die Schnittstelle (Geschwindigkeit etc.) muß ich vor oder nach dem öffnen der Schnittstelle aufrufen?
Das komische ist ja, dass schon irgendwas gesendet wird.
Wenn ich eine längere String "versuche zu" senden, dann bekomme ich auch mehr Zeichen als bei einer kurzen.
Deshalb dachte ich an einen Umwandlungsfehler.MfG ACU
-
Ich habe gerade nochmal ausprobiet:
Wenn ich die konfiguriere, bevor die Schnittstelle geöffnet ist, kommen 2 Fehler (Fehler beim lesen und Fehler beim schreiben), wenn ich jedoch die Schnittstelle vorher öffne, kommt nur: "Fehler beim schreiben".MfG ACU
-
die schnittstelle muss geöffnet sein, bevor du sie konfigurieren kannst.
// Timeouts fuer Port setzen void SetReadTimeouts(HANDLE hCom) { COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout = 100; // Zeit zwischen 2 Zeichen timeouts.ReadTotalTimeoutMultiplier = 0; // pro Zeichen timeouts.ReadTotalTimeoutConstant = 1; timeouts.WriteTotalTimeoutConstant = 0; // kein Timeout beim Schreiben timeouts.WriteTotalTimeoutMultiplier = 0; if (!::SetCommTimeouts(hCom, &timeouts)) { // ... Fehler } } // hCom ist im Header definiert (HANDLE hCom) void __fastcall TForm1::OpenComPort(char *Port) { if ((hCom = OpenComm(Port)) != INVALID_HANDLE_VALUE) { // mit default-Werten initialisieren SetDeviceControlBlock(hCom, CBR_9600, 8, NOPARITY, ONESTOPBIT); // Timeouts setzen SetReadTimeouts(hCom); } } void __fastcall TForm1::Button1Click(TObject *Sender) { OpenComPort("COM1"); }wenn du auf Button1 klickst, solltest du schonmal keine fehler bekommen, es sein denn deine Com existiert nicht.
-
statt char in SendData und ReceiveData könnteste auch unsigned char nehmen. vlei liegts daran...
int SendData(HANDLE hCom, unsigned char *Data, int Length) { ... }