2009-03-31 8 views
2

Ich habe ein sehr merkwürdiges Problem hier, vielleicht können Sie mir helfen. Ich habe ein Windows CE 6-Gerät, das einen Barcode-Kartenleser verwendet, der über eine serielle Schnittstelle angeschlossen ist. Ich benutze die Compact Framework (v2.0) SerialPort Klasse, um damit umzugehen, und alles hat gut funktioniert.SerialPort.Open() friert das System ein, wenn Daten zuvor empfangen wurden (Compact Framework)

Es gibt jedoch ein Problem. Wenn eine Karte zu irgendeinem Zeitpunkt übersprungen wird, bevor die serielle Schnittstelle geöffnet wird, bleibt das gesamte System beim Aufruf Open() hängen. Keine Ausnahmen, keine Warnungen, nur ein kompletter System-Freeze ohne Grund. Ich habe versucht, die Puffer vor dem Öffnen des Ports zu löschen, aber anscheinend kann diese Methode nur verwendet werden, nachdem der Port geöffnet wurde, weil ich eine InvalidOperationException bekam.

Ich machte eine vereinfachte Version des Codes, um zu sehen, ob die Komplexität etwas damit zu tun hatte, aber ein einfaches Formular mit einer Schaltfläche, die den Port öffnet, wird auf die gleiche Weise einfrieren. Hier ist der vereinfachte Code:

private void btConnect_Click(object sender, EventArgs e) 
{ 
     try 
     { 
      this.serialPort = new SerialPort(this.txName.Text, Convert.ToInt32(this.txBaud.Text)); 
      this.serialPort.RtsEnable = this.chRTS.Checked; 

      this.serialPort.Open(); //it freezes here 
      this.btConnect.Text = "Disconnect"; 

      this.txName.Enabled = false; 
      this.txBaud.Enabled = false; 
      this.chRTS.Enabled = false; 
     } 
     catch 
     { 
      MessageBox.Show("Failed to open port. Please check your settings and try again.", "Operation failed", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); 
     } 
} 

Ich kann nicht sehen, was ich falsch mache, ich fange an zu glauben, dass es ein Fehler in dem kompakten Rahmen ist. Der Kartenleser sendet Pakete wie F03030DKD03003\r\n. Irgendwelche Ideen? Danke im Voraus.

Antwort

1

Als ich mit seriellen Treibern anfing, kam es zu einem Fehler in den 16550 UARTs (zumindest einige von ihnen), dass der Chip gesperrt wurde, wenn Daten im Empfangsdatenregister vorhanden waren aktiviert.

Ich habe diesen Fehler behoben, indem der Treiber den Chip löschte, bevor die FIFOs aktiviert wurden. Ich wäre jedoch überrascht, wenn etwas so Neues wie WinCE 6 diesen Fehler nicht beheben würde, aber ich nehme an, dass es möglich ist (vielleicht haben die aktuellsten 16550 Implementierungen diesen Fehler nicht mehr). Ich bin nicht besonders vertraut mit WinCE - ist die Quelle für den seriellen Treiber in einigen DDK verfügbar? Gibt es eine Unterstützung/Update-Option für den seriellen Treiber, den Sie verwenden?

+0

Leider eine schlechte Annahme - der serielle Treiber wird vom OEM zur Verfügung gestellt - sicher CE wird mit einem Muster geliefert, aber viele, viele OEMs bringen nur ihre alten Treiber von früheren Versionen mit. – ctacke

3

Die von MS bereitgestellten SerialPort-Klassen lassen viel zu wünschen übrig. Was Sie wirklich wissen müssen, ist genau, wo in den nativen Anrufen die Sache feststeckt. Meine Vermutung ist, dass die internen Puffer Daten in ihnen haben, oder vielleicht sogar ein Überlauf gesetzt ist, und der verwaltete Wrapper kotzt darauf.

Mein Vorschlag ist, die OpenNETCF serial library zu bekommen, die frei ist und mit voller Quelle kommt. Es ist schnittstellenkompatibel mit den von MS bereitgestellten Klassen und ermöglicht es Ihnen, den Code bis hin zu den Treiberaufrufen zu verfolgen, um zu sehen, was vor sich geht.

Verwandte Themen