Serielle Schnittstelle Com1 ansteuern
-
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) { ... }
-
Danke für die Tipps, aber ich komme einfach nicht weiter.
Ich hänge mein Projekt mal an, vielleicht findet ja noch jemand nen Fehler.MfG ACU
-
bloss mal so:
#define ONESTOPBIT 0 #define ONE5STOPBITS 1 #define TWOSTOPBITS 2COM1 hat sicherlich nie 1.5 stopbits! da bekomme ich auch fehler.
du solltest das schon so hinschreiben wie ich dir das vorgegeben habe und ausserdem die globalen windows-konstanten verwenden und dir nicht irgendetwas ausdenken!
siehe Win32-SDK unter DCB oder in die MSDN
zu deinem code.
warum stehen die ganzen funktionen in nem header?
warum bindet der header die vcl-unit ein?
-> bau dir ne klasse fuer das serielle zeugs.
-
Vielen Dank, jetzt funktioniert es.
Was meinst du damit, dass ich mir keine eigenen Konstanten ausdenken soll?Was spricht gegen das auslagern in eine Header Datei?
Ich dachte das macht man so.Eine Klasse zu schreiben, werde ich sowieso bald noch machen.
1,5 Stopbits gibt es, aber das war in meinem Fall nicht gewünscht ;).
Dann möchte ich nur noch wissen, wie ich eine ANSIString wieder in eine normale Borland String umwandeln kann, bitte nicht schimpfen, ich habs nicht gefunden.
MfG ACU
-
Ich bin jetzt etwas weitergekommen.
Einzelne Bytes empfange ich jetzt über die Schnittstelle.
Diesen Code verwende ich:char *Empfang = new char[1]; ReceiveData(Schnittstelle,Empfang,1); Memo1->Lines->Add(Empfang);Dummerweise kommt nicht nur mein einzelnes Zeichen sondern hinter dem Zeichen meist noch ein || oder ein |+.
Kann mir jemand sagen, wie ich das wegbekomme?MfG ACU
-
char OneByte; ReceiveData(Schnittstelle, &OneByte, 1); Memo1->Lines->Add(AnsiString(OneByte));oder:
char *OneByte = new char[2]; OneByte[1] = '\0'; ReceiveData(Schnittstelle, OneByte, 1); Memo1->Lines->Add(AnsiString(OneByte));
-
Super, danke für die Hilfe!
Jetzt bin ich ein ganzes Stück weiter.
Ich habe nach einer Funktion gesucht, die mir zurückliefert, ob bereits Daten zum Empfang im Puffer bereitstehen.
Leider war ich noch nicht so erfolgreich.Im MSDN Artikel wird ein Pameter Namens EV_RXCHAR beschrieben.
Zur Funktion steht:A new character was received and placed in the input buffer.
Das klang mir genau nach dem, dass ich suche.
Ich habs deshalb mal das probiert:if (!SetCommMask(hComm, EV_RXCHAR))Irgendwie macht der Code leider nicht, was er soll.
Auf neue Zeichen reagiert er nicht.
Nur eine gewisse Abhängigkeit, ob die Serielle Schnittstelle geöffnet oder geschloßen ist, wurde von mir beobachtet.Wie muß der Code richtig heißen?
MfG ACU
-
Kann mir den keiner helfen?
SOllte doch für die Profis eigentlich nicht so schwer sein oder?MfG ACU
-
schon was von wochenende gehört?!

-
Dagegen ist nichts einzuwenden, wäre aber trotzdem schön, wenn jemand helfen könnte, da ich ohne die Abfrage nicht weiterkomme.
Weißt du nicht zufällig was? Du scheinst ja Ahnung zu haben.
MfG ACU
-
guckst du hier: