Wie kann ich mit der Windows-API-Null-Zeichen an die serielle Schnittstelle senden?

StackOverflow https://stackoverflow.com/questions/387322

  •  23-08-2019
  •  | 
  •  

Frage

Ich arbeite auf einem Windows-Dienstprogramm, das mit einiger kundenspezifische Hardware mit einem Standard-COM-Port in Verbindung steht. Das Kommunikationsprotokoll (die aus meiner Kontrolle ist) verlangt von mir roh 8-Bit-Datenbytes zu senden und zu empfangen.

Ich bin derzeit mit der folgenden Windows-API-Funktion Daten an dem COM-Port senden:

WriteFile(hFile, lpBuffer, numberOfBytesToWrite, ...)

wobei hFile ist ein Verweis auf den richtig geöffnet COM-Port und lpBuffer ist ein Array von Bytes, die ich in einem Speicher gespeichert sind. Der Code funktioniert perfekt, bis ein Null-Zeichen (ASCII Null) muss an das Gerät gesendet werden. WriteFile hört auf zu senden, sobald es das Null-Zeichen erkennt, weil er davon ausgeht, dass er das Ende des Strings erreicht hat. Dies geschieht, obwohl ich numberOfBytesToWrite richtig eingestellt ist.

Wie kann ich Rohdaten an dem COM-Port mit dem Windows-API senden? Ich würde es vorziehen, einen Standard-API-Aufruf zu verwenden, ähnlich wie WriteFile, aber ich bin offen für Vorschläge.

Ich bin derzeit mit Rapidq das Dienstprogramm zu bauen, aber alle es tut, ist die Windows-API-Funktion aufrufen direkt an.

Bearbeiten: Mein Setup besteht aus einem Windows-PC über eine serielle Schnittstelle mit dem kundenspezifischen Hardwaremodul. Das Modul verfügt über einen kleinen Bildschirm, auf das ich bin in der Lage, die übertragenen Zeichen anzuzeigen. Ich habe diese Einrichtung mit einem anderen Drittanbieter-Dienstprogramm Programm getestet. Ich bin mit dem Modul kommunizieren kann dieses Dritte Programm, und Null-Zeichen richtig angezeigt. In meinem eigenen Programm, wenn ich WriteFile, ein Null-Zeichen überall im Sendestrom verwenden stoppen die Reste des Stroms aus gesendet werden.

War es hilfreich?

Lösung

Ich habe, bevor Windows serielle Schnittstelle Programmierung getan, und ich bin sicher, dass ich in der Lage gewesen Null-Zeichen über die seriellen Ports zu senden (würden verschiedene Dateiübertragungsprotokolle haben sonst nicht funktioniert). Ich kann mir zwei mögliche Erklärungen:

  1. Das Empfangen Gerät die Daten druckt sie unter Verwendung eines Verfahrens erhalten, das bei der ersten Null-Zeichen stoppt. Wie werden Bestimmen Sie, dass die Übertragungseinrichtung an der ersten Null ist beendet? Könnte das Problem irgendwo weiter unten in der Zeile sein?
  2. Der serielle Treiber ist defekt. Das ist eher unwahrscheinlich, aber eine mögliche Erklärung. Wenn Sie etwas zwielichtige proprietäre Dritte serielle Schnittstelle und ihre Treiber verwenden, dann könnten sie verdächtig sein. Wenn Sie einen integrierten Standard-verwenden serielle Schnittstelle mit den normalen Windows-Treiber, dann ist dies wahrscheinlich kein Problem.

Ich hatte nur einen kurzen Blick auf Rapidq und es gibt eine dritte mögliche Erklärung:

  1. Die Serialisieren der Rapidq in den Prozessfunktionen des Aufrufs Win32 API tun können Probleme mit eingebetteten Nullzeichen in den Daten haben zu senden. Ich weiß nichts über Rapidq, aber das ist noch ein weiteres Glied in der Kette, die berücksichtigt werden müssen.

Andere Tipps

Greg ist wohl richtig, aber ich würde auch auf dem COM-Port-Einstellungen überprüfen. Stellen Sie sicher, dass Ihre DCB-Einstellungen richtig eingestellt sind. Look up SetCommState und GetCommState für weitere Informationen.

Normalerweise ist Serial-8N1, aber Ihr Gerät ist möglicherweise eine andere Parität sein, oder Bit-Konfiguration stoppen, etc.

Wie Greg, ich habe eine Menge Arbeit über serielle selbst getan, und dies kann oft die Ursache von Problemen sein ... Versuchen Sie, mit RS485 zu sprechen und einer falschen DCB-Struktur ... heh ..

Larry

PS: Wenn Sie nicht bereits eine haben, ich würde empfehlen, sich eine gute Serien Break-Out-Box zu bekommen. Ich habe eine irgendwo rund um das Haus, und es wird Ihnen zeigen, was alle Signale sind, auf allen Linien bei all Ihrer Kommunikation, und ist ein sehr leistungsfähiges Debugging-Tool.

Ich habe Writefile in der Vergangenheit verwendet und es funktionierte mit Null-Bytes in Ordnung. Ich würde graben sich in Rapidq, es könnte das Problem sein.

Wenn nichts hilft, können Sie immer tun, was ich tue. Verwenden Sie Gregs COMM-Code mit dem Gerät zu testen. Denken Sie daran, Qmodem? :) Sehr schönes Tool zum Testen / Debuggen seriellen Routinen. Sie ccould sogar Qmodem und ein einfaches Qmodem Skript verwenden, um die COM-Port auf einem anderen Feld (oder einem anderen Hafen in der gleichen Box) zu lesen und den Hex-Wert von jeder gesendeten char ausdrucken. Oh, Moment mal. Qmodem hat, dass eingebaut. :) Verwenden Sie die Debug-ASCII-Emulation und es wird die Hex-Werte jedes Zeichen zeigen, die über die serielle Schnittstelle kommt. Dann könnten Sie zumindest prüfen, ob der Code richtig funktioniert oder nicht.

Jetzt Frage. Writefile zurückgibt, wenn es die NULL trifft, oder ist es einfach nur sitzen und warten, und nie wieder?

Wenn es nie zurückgibt, dann kann es nicht, Ihren Code sein. Writefile liefert nur dann, wenn sie alle dwBytesToWrite gesendet hat, oder wenn es einen Fehler gibt. Alles andere, und es versucht zu schreiben, aber es ist ein Fehler, auf der anderen Seite.

Um ein NULL-Zeichen über die serielle senden Sie die SetEndOfFile () Funktion verwenden können, die Port-Handler als Datei geben.

Wenn Sie zu viele NULL-Daten, es zu senden ist wahrscheinlich nicht ideal, aber es ist eine Abhilfe.

Funktion Details

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top