2009-08-21 3 views
3

Ich entwickle einige Monitoring-Tool für eine Art von Protokoll über die serielle Kommunikation basiert.C# Serieller_Anschluss Geschwindigkeit

Serielle Baudrate = 187,5kb Ich verwende System.IO.Ports.SerialPort Klasse.

Dieses Protokoll hat vier Arten von Frames. Sie haben 1Byte, 3Bytes, 6Bytes, 10-255Bytes. Ich kann mit ihnen arbeiten, aber ich empfange sie zu spät, um zu antworten.

Für den Anfang habe ich erst nach ex verpackt erhalten. 96ms (zu spät), und es enthält etwa 1000B. Dies bedeutet 20-50 Frames (zu viel, zu spät). Später arbeitet es stabiler, 3-10Bytes, aber es ist immer noch zu spät, weil es 1-2 Frames enthält. Natürlich ist 1 Bild OK, aber 2 ist zu spät.

Können Sie mir zeigen, wie kann ich damit umgehen zuverlässiger? Ich weiß, dass es möglich ist.

revision1:

Ich versuchte gerade Weg:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
     if (!serialPort1.IsOpen) return; 
     this.BeginInvoke(new EventHandler(this.DataReceived)); 
} 

Und Backgroud Arbeiter: Und ... neuen Tread (Read) und ... immer das gleiche. Zu spät, zu langsam. Muss ich zurück zu WinApi gehen und einige kernel32.dll Funktionen importieren?

Revision 2: ist dies der Teil des Codes des Einsatzes in der Treading Weise:

int c = serialPort1.BytesToRead; 
byte[] b = new byte[c]; 
serialPort1.Read(b, 0, c); 

Ich denke, es Gebrauch ein Problem mit Strom innerhalb Serialport-Klasse ist. Oder ein Synchronisationsproblem.

Revision 3: ich beide nicht auf einmal verwenden !! Ich habe es einfach anders versucht.

Grüße MarekK

+0

Ohne irgendeine Art von Code und irgendeine Art von Informationen werden sehr wenige Menschen Ihnen helfen können. Wie liest du vom Hafen? –

+0

Allgemein funktioniert der Code und ist ziemlich groß. Es sieht so aus, dass ein Teil des Codes auf etwas wartet. Ich kenne keine Hexe. – MrHIDEn

+0

** Ich habe versucht, BaseStream zu verwenden, die SerialPort-Unterklasse ist. Ich habe das gleiche Ergebnis. ABER !!!!!! Ich fing an, nach PCIe-Karte für meinen Laptop zu suchen, und ich habe gefunden, dass Konverter, die auf USB sogar in PCI Expresscard basieren, keine gute Kommunikationsebene wegen des USB-Stapels bereitstellen. Wo ich denke, Datenstrom wartet auf USB-Verfahren. Ich kann mir vorstellen, dass dies die größten Schwierigkeiten bereitet. Ich werde PCIe-232-Karte kaufen. ** – MrHIDEn

Antwort

1

Vielleicht sollten Sie diese first lesen, da dieser Fehler mit DataReceived Ereignis zu tun hat, die nicht manchmal abfeuert, und es wird festgelegt nach wie vor nicht in Framework 3.0/3.5. Außerdem sollten Sie etwas lesen here über dieses Plakat, das das Problem an Microsoft gemeldet hat, als er Probleme hatte, es unter VS2008/NET 3.5 zu verwenden ... Ich kann nicht sagen, ob das wahr ist oder nicht ... aber ist etwas, das es wert ist, im Gedächtnis zu behalten über ... und Microsoft hatte einige Schwierigkeiten mit der .NET-Version, die in .NET Version 2 eingeführt wurde.

Zu der Zeit, ich war mit .NET 1.1, stieß ich auf Vorschläge, um die Version zu verwenden das kam mit VB6 ActiveX-Steuerelement, das auf dem Internet zu source s nach, dass es die besten serieller Kommunikation Kontrolle war !!!

Sie könnten besser nach einem Code von Drittanbietern suchen, um die seriellen Kommunikationen zu verarbeiten, normalerweise solche, die außerhalb der verwalteten Welt geschrieben wurden, d. H. Nicht verwaltet mit vielen p/Aufrufen.

Ich habe versucht, John Hind-Version in dem MSDN-Artikel gefunden mit here, die ich gefunden habe sehr abstoßend, da es keine Möglichkeit gab es asynchron zu tun, und es war eine schreckliche Codierung Erfahrung ..

I Am Ende verwendete man einen, der von Franson geliefert wurde, der bessere Ergebnisse als Hinds Code produzierte.

Hoffen, dass dies hilft, Mit freundlichen Grüßen, Tom.

Verwandte Themen