Laden...

SerialPort (COM1) lässt sich nicht auslesen

Erstellt von Kleba vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.910 Views
K
Kleba Themenstarter:in
71 Beiträge seit 2007
vor 15 Jahren
SerialPort (COM1) lässt sich nicht auslesen

Hallo zusammen,

ich habe ein Problem mit der Kommunikation über den COM1-Anschluss. Und zwar habe ich hier einen Barcode-Scanner (so kleines handliches Gerät) mit einer Station über welche der Scanner angeschlossen wird. Heißt, man scannt mit dem Gerät rum wie man will und stellt es danach in die Station um die Daten abzurufen.

Problem ist jetzt aber, dass ich wenn ich mit _mySerialPort.ReadExisting() die Daten auslesen will, die Rückgabe immer leer ist. Auch wenn ich vorher mit BytesToRead() nachschaue ob was vorhanden ist, bekomme ich immer 0 zurück.

Im Programm kommts mir immer so vor, als würden gar keine Daten bereitstehen. Ich habe aber noch eine andere Drittanbieter-Software die das ganze auslesen kann, womit ich weiß, dass Daten vorhanden sind.
Ich will quasi so eine Software selbst schreiben.

Um jetzt zur eigentlichen Frage zu kommen: kann es sein, dass vor abrufen der Daten, geräteabhängig irgendetwas gesendet werden muss? Woran kann es liegen, dass ich gar keine Daten bekomme? Und kann zufällig jemand in verständlichen Worten (habe bisher nichts für mich verständliches finden können) beschreiben was es mit den "Handshakes" auf sich hat (und ob es vielleicht daran liegt)?

Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken. Wenn ich was vergessen habe sollte was zur Aufklärung beitragen kann, bitte ich um kurze Rückmeldung 😃

Lieben Gruß
Kleba

Alle sagten es geht nicht. Da kam einer der wusste das nicht und tat es.

479 Beiträge seit 2008
vor 15 Jahren

Hallo Kleba,

hast du den Port den geöffnet (_mySerialPort.Open())?
Sonst hilft dir vielleicht der DataReceived EventHandler.

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
P
60 Beiträge seit 2006
vor 15 Jahren

Hallo Kleba,

das mit dem 'Handshake' kann durchaus was damit zu tun haben. Wenn dir das gar nichts sagt, so schau' mal in Wikipedia unter 'Datenflusskontrolle' nach
http://de.wikipedia.org/wiki/Datenflusskontrolle

Das besagt eigentlich ganz bildlich gesprochen, dass je nach 'handshake' der Sender erst anfängt, wenn der Empfänger bereit ist - bzw. der Empfänger sagt 'du bist mir zu schnell, warte erstmal'.

Dazu gibt es ein Hardware Handshake (RTS / CTS), was meint, dass ein Pegel gesetzt wird. Das ist am 'sichersten'.
Ein Software Handshake sendet ein bestimmtes Zeichen (XON / XOFF), dass es losgehen soll bzw. dass Ende ist.
Die Übertragungsrate (Baudrate) muss natürlich auch stimmen, was meint, dass beide mit der selben Geschwindigkeit was auf die Leitung geben.

479 Beiträge seit 2008
vor 15 Jahren

stimmt...

[Follow me on Twitter](http://twitter.com/blendingsky)
K
Kleba Themenstarter:in
71 Beiträge seit 2007
vor 15 Jahren

Wie ist das denn, wenn ich nicht sicher bin wie die Baudrate von dem Gerät ist? Das mit dem Handshake schau ich mir morgen mal an, heute hab ich schon zuviel getrunken 😃
Kann man die Baudrate von dem Gerät irgendwie ermitteln?

Danke schon mal für eure konstruktiven Hinweise!

Alle sagten es geht nicht. Da kam einer der wusste das nicht und tat es.

P
60 Beiträge seit 2006
vor 15 Jahren

Hallo Kleba,

normalerweise hat so ein Gerät eine Defaulteinstellung, die irgendwo im Handbuch steht (z.B. 4800Baud, NoParity, 8bit, ...). Dein Programm sollte auf jeden Fall einen kleinen Dialog haben, wo man aus einer Combobox diese paar diskreten Werte (2400,4800,9600,19200,..) einstellen darf, ebenso Parity (None,..).
Alternativ natürlich wo in einer (XML)Konfig z.B. das steht.

Manche Programme, die serielle / Bluetooth - GPS Receiver z.B. abfragen, suchen einfach in eine Setup auf Anforderung dann alle COMx / Baudrates in einer Schleife durch, bis sie 'vernünftige' Daten bekommen. Die tun sich natürlich leichter, da sie wissen, was 'vernünftig' ist (=NMEA Strings). Ist aber halt auch eine Möglichkeit.

Noch eine Info (vielleicht ist dir das eh' schon klar, dann entschuldige):

  1. Ein industrieller Barcode - Reader hat normalerweise aber auch selber einen Setupmode, bei dem er nach Erhalt eines 'Initialisierungsbarcodes' dann aus einem Ausdruck / gedruckten Handbuch mehrere Barcodes einlesen kann, die u.a. auch die Baudrate der seriellen Schnittstelle enthalten.

  2. Barcode - Reader könne alternativ aber auch direkt in den Tastaturpuffer schreiben, dann erhält eben die aktuell den Focus habende Applikation den gescannten String in den Eingabepuffer. DA muss man im Programm gar nichts machen, dafür kommt es halt immer bei dem an, der den Focus hat. Da muss man dann eine herstellerabhängige Art 'DataWedge' starten. Ist halt, wenn die SW auf dem Reader (Windows CE,..) selber läuft, interessant.

  3. Eine - herstellerabhängige - API (SDK) erlaubt meist, einen Barcode Reader dann auch quasi 'raw' anzusprechen. Muss man halt echt mehr programmieren als bei '2.' aber man könnte bei jedem Eingabefeld z.B auf eine maximale/minimale Leselänge umstellen oder z.B auf einen anderen Barcodetyp (Code039,...).
    Ist halt auch, wenn die SW auf dem Reader (Windows CE,..) selber läuft, interessant.

Gruss

479 Beiträge seit 2008
vor 15 Jahren

Achja, und wenn du eine ComboBox mit den Portnamen füllen willst: [Snippet] Bessere Methode als SerialPort.GetPortNames()

[Follow me on Twitter](http://twitter.com/blendingsky)
K
Kleba Themenstarter:in
71 Beiträge seit 2007
vor 15 Jahren

Hallo zusammen,

vielen Dank erstmal an dich proper_csharp, für deine ausführlichen Informationen. Um mal kurz aufzuklären was, das für ein Scanner ist: der Scanner hat kein eigenes OS oder ähnliches. Es ist nur ein ganz einfaches Handgerät, welches 2 Tasten hat (zum scannen und zum löschen von gescannten). Dieses (kabellose) Handgerät hat dann eine Basisstation, welche über ein Kabel mit der seriellen Schnittstelle (COM1) verbunden ist.
Leider habe ich keinerlei Datenblatt zu dem Gerät (da werde ich aber noch mal genauer googlen) und weiß auch dementsprechend nicht, mit welcher Baudrate oder ähnlichem ich es verbinden soll.
Ich google jetzt erstmal weiter, und Danke euch beiden für die hilfreichen Tipps!

Lieben Gruß
Kleba

*edit* Achja, das Gerät hat einen kleinen Speicher der erst ausgelesen werden kann, sobald das Gerät in die Station gesteckt wird. Es wird auch nicht automatisch gesendet sobald es in die Station geht. Soviel weiß ich, da die andere Software das auch erst irgendwie aufrufen muss.

*edit 2* So, ich habe endlich ein Tool gefunden, dass ohne Exception mal den Serial-Port logged. Weiß von euch jemand "auf die schnelle" was folgende Werte bedeuten? Falls nicht, google ich es mir zusammen, aber vielleicht hat ja von euch jemand eine Idee. Hier die Werte:

[16:00:08] Flow control is changed to:
[16:00:08] ControlHandShake = 80000001
[16:00:08] Flow Replace = 80000040
[16:00:08] XOn Limit = 1388
[16:00:08] XOff Limit = 4e2
[16:00:08] Timeouts is changed to:
[16:00:08] RIT = -1
[16:00:08] RTTM = 0
[16:00:08] RTTC = 0
[16:00:08] WTTM = 0
[16:00:08] WTTC = 0

Danke noch mal!

Alle sagten es geht nicht. Da kam einer der wusste das nicht und tat es.

888 Beiträge seit 2007
vor 15 Jahren

Hallo Kleba,

also ich arbeite jeden Tag mit seriellen Handscannern.
Ich kann Dir sagen, das sollte keine Ding sein.

Welche Marke ist Dein Scanner?

Als weiteres empfehle ich Dir das Template SerialPort .

Damit solltest Du Deine Probleme sofort lösen können,
also Scanner anschließen, UART einstellen, Scannen.

Probier mal & gib Feedback.

Grüße

Edit:
Funktioniert der Scanner mit Windows - HyperTerminal?

K
Kleba Themenstarter:in
71 Beiträge seit 2007
vor 15 Jahren

Hallo joetempes,

erstmal Entschuldigung, dass ich noch nicht geantwortet hatte. Hab im Moment nicht soviel Zeit...

Der Scanner ist so einer. Das Template habe ich bereits erfolglos ausprobiert 😦 (mit den unterschiedlicshten Einstellungen).

Über das HyperTerminal bekomme ich auch keine Verbindung. Mit der dazugehörigen Software, weshalb meine Vermutung war, dass der Scanner erst reagiert, nachdem er irgendetwas gesendet bekommt. Im kompletten Log steht z.B. bevor er etwas empfängt noch:

[16:00:08] ====================================
[16:00:08] Serial port opened.
[16:00:08] ====================================
[16:00:08] Application: D:\Programme\AW_EasyScan\EasyScan.exe
[16:00:08] Line control is changed to:
[16:00:08] WordLen = 7
[16:00:08] Stop Bits = 1
[16:00:08] Parity = even
[16:00:08] RTS state is ON
[16:00:08] DTR state is ON
[16:00:08] Baudrate has been changed to 9600
[16:00:08] Flow control is changed to:
[16:00:08] ControlHandShake = 80000001
[16:00:08] Flow Replace = 80000040
[16:00:08] XOn Limit = 1388
[16:00:08] XOff Limit = 4e2
[16:00:08] Timeouts is changed to:
[16:00:08] RIT = -1
[16:00:08] RTTM = 0
[16:00:08] RTTC = 0
[16:00:08] WTTM = 0
[16:00:08] WTTC = 0
[16:00:08] Flow control is changed to:
[16:00:08] ControlHandShake = 80000001
[16:00:08] Flow Replace = 80000040
[16:00:08] XOn Limit = 1388
[16:00:08] XOff Limit = 4e2
[16:00:08] Line control is changed to:
[16:00:08] WordLen = 8
[16:00:08] Stop Bits = 1
[16:00:08] Parity = no parity
[16:00:08] Sent: 1 byte(s)
[16:00:08] 
[16:00:08] Sent: 1 byte(s)
[16:00:08] @
[16:00:08] Sent: 1 byte(s)
[16:00:08] I
[16:00:08] Sent: 1 byte(s)
[16:00:08] 
[16:00:08] Received: 8 byte(s)
[16:00:08] @WUE
[16:00:08] Received: 0 byte(s)
[16:00:08]
[16:00:08] Received: 8 byte(s)
[16:00:08] RTH 1MS-
[16:00:08] Received: 8 byte(s)
[16:00:08] V1.01.6I
[16:00:08] Received: 1 byte(s)
[16:00:08] k
[16:00:08] Received: 0 byte(s)
[16:00:08]
[16:00:08] Sent: 1 byte(s)
[16:00:08] 
[16:00:08] Sent: 1 byte(s)
[16:00:08] @
[16:00:08] Sent: 1 byte(s)
[16:00:08] U
[16:00:08] Sent: 1 byte(s)
[16:00:08] 
[16:00:08] Received: 8 byte(s)
[16:00:08] @MemoS
[16:00:08] Received: 0 byte(s)
[16:00:08]
[16:00:08] Received: 8 byte(s)
[16:00:08] c
[16:00:08] Received: 0 byte(s)
[16:00:08]
[16:00:08] Received: 6 byte(s)
[16:00:08] 96135
[16:00:08] Received: 0 byte(s)
[16:00:08]
[16:00:09] Sent: 1 byte(s)
[16:00:09] 
[16:00:09] Sent: 1 byte(s)
[16:00:09] @
[16:00:09] Sent: 1 byte(s)
[16:00:09] C
[16:00:09] Sent: 1 byte(s)
[16:00:09] 
[16:00:11] Sent: 1 byte(s)
[16:00:11] 
[16:00:11] Sent: 1 byte(s)
[16:00:11] @
[16:00:11] Sent: 1 byte(s)
[16:00:11] P
[16:00:11] Sent: 1 byte(s)
[16:00:11]
[16:00:11] Received: 5 byte(s)
[16:00:11] @P
[16:00:11] Received: 0 byte(s)
[16:00:11]
[16:00:12] DTR state is OFF
[16:00:12] ====================================
[16:00:12] Serial port closed
[16:00:12] ====================================
[16:00:12] RTS state is OFF

Vielleicht wirst du ja daraus schlau? Also für mich sieht das so aus, als würde er bevor der Client etwas empfangen kann, etwas senden müssen.

Ich kann mich natürlich auch irren 😃

Das ist auf jedenfall das Log zu dem Vorgang, wenn die "Original"-Software mit dem Gerät kommuniziert.

Viele Grüße
Kleba

Alle sagten es geht nicht. Da kam einer der wusste das nicht und tat es.

888 Beiträge seit 2007
vor 15 Jahren

Ja es sieht so aus als wenn der Scanner eine bidirektionale Kommunikation benötigt.
Es gibt auch Geräte die Verlangen ein Antwort, wenn das Gerät etwas gesendet hat.

Da hilft nur eins Schnittstellen-Spezifikation besorgen (Hersteller anrufen).

K
Kleba Themenstarter:in
71 Beiträge seit 2007
vor 15 Jahren

Ok, dann weiß ich Bescheid... auch wenn's blöde ist 😉

Danke für eure lieben Tipps/Hilfe!

Lieben Gruß
kleba

Alle sagten es geht nicht. Da kam einer der wusste das nicht und tat es.