2016-03-24 15 views
0

Ich arbeite an einer kleinen Winform-Anwendung, die Eingabe von einem Barcode-Scanner auf einem virtuellen COM-Port liest und schreibt die Daten zurück in ein Textfeld auf meiner Winform. Ich bin neu in C#, also habe ich mich durchgeschlagen. Mein aktueller Code ist unten und angepasst von hereBarcode-Scanner nur ein Zeichen lesen

namespace Barcode_Scanner 
{ 
    public partial class Form1 : Form 
    { 
     SerialPort sp; 


     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      string[] ports = SerialPort.GetPortNames(); 
      comboBox1.DataSource = ports; 
      Application.DoEvents(); 




     } 

     private void btn_getComData_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       if (!sp.IsOpen) 
        sp.Open(); 
       sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("There was a problem with the Serial Port: " + ex.Message, "Error!"); 
      } 
     } 
     void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      sp = (SerialPort)sender; 
      string data = sp.ReadExisting(); 
      txt_comData.Text = data;   
      Application.DoEvents(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      // Makes sure serial port is open before trying to write 
      string portname = comboBox1.SelectedItem.ToString(); 
      sp = new SerialPort(portname, 9600, Parity.None, 8, StopBits.One); 
      sp.Handshake = Handshake.None; 
      sp.Open(); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      sp.Close(); 
     } 
    } 
} 

Der vollständige String Ich versuche, „3894038“ zu scannen ist, aber ich bin nur in der Lage, die Textbox zu bekommen um ein Zeichen zu einem Zeitpunkt, in dem Textfeld angezeigt werden soll. Ich vermute, dass es etwas mit meinem .ReadExisting-Befehl zu tun hat, aber ich bin etwas perplex darüber, wie es weitergehen soll. Stimmt etwas mit meinem Code nicht?

Vielen Dank für die Hilfe im Voraus.

Marshall

+1

Der Code, den Sie nicht geschrieben nicht mit den Daten alles tun, einmal gelesen. Es fällt mir schwer zu glauben, dass Sie mit Ihrem aktuellen Code nur ein Zeichen in einer Textbox sehen. –

+0

Sorry @JasonWatkins Ich hatte ein Stück meines Codes weggelassen, das ich kürzlich hinzugefügt habe. Ich habe versucht, die Ausgabedaten direkt in ein Textfeld in sp_DataReceived zu schreiben. Ich habe den Code aktualisiert, um die Auslassung zu beheben. – MarshallTrufant

Antwort

1

Es gibt einige Probleme mit Ihrem Code. Das von Ihnen beschriebene Problem wird dadurch verursacht, dass Sie den Wert ReadExisting dem Textfeld zuweisen, anstatt ihn anzuhängen. Ich habe das und einige andere Probleme unten behoben.

Hinweise:

  • Verwenden AppendText statt Zuweisung Text der neuen Daten an das Ende des Textfeldes
  • Es hinzuzufügen, ist so gut wie nie ein guter Grund Application.DoEvents
  • Sie den seriellen Port öffnen anrufen inkonsistent an zwei verschiedenen Stellen
  • Sie haben bereits sp definiert auf Klassenebene; Sie müssen es nicht mit einer Besetzung des Ereignis-Absenders ausblenden.

Festcode:

namespace Barcode_Scanner 
{ 
    public partial class Form1 : Form 
    { 
     SerialPort sp; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      string[] ports = SerialPort.GetPortNames(); 
      comboBox1.DataSource = ports; 
     } 

     private void btn_getComData_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       if (!sp.IsOpen) 
       { 
        button1_Click(null, EventArgs.Empty); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("There was a problem with the Serial Port: " + ex.Message, "Error!"); 
      } 
     } 

     void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      string data = sp.ReadExisting(); 
      txt_comData.Appendtext(data); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      // Makes sure serial port is open before trying to write 
      string portname = comboBox1.SelectedItem.ToString(); 
      sp = new SerialPort(portname, 9600, Parity.None, 8, StopBits.One); 
      sp.Handshake = Handshake.None; 
      sp.Open(); 
      sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      sp.Close(); 
     } 
    } 
} 
+0

Ich kann dir nicht sagen, wie lange ich damit zu kämpfen habe. Ihr aktualisierter Code hat mir wirklich geholfen zu sehen, wo ich falsch gelaufen bin (viel zu lernen). Ich denke, wo ich missverstanden habe, war in der Zeile 'sp.DataReceived + = new SerialDataReceivedEventHandler (sp_DataReceived);' Es muss jedes Zeichen in den Barcode-Daten durchlaufen, anstatt alle Zeichen vor der Rückkehr zu erfassen? – MarshallTrufant

+0

'sp.DataReceived + = ...' Fügt nur einem Event-Handler, der mit dem seriellen Port aufgerufen wird, mehr Daten zu. In diesem Moment wird dem Textfeld nichts hinzugefügt. Später (wenn Sie den Barcode scannen) empfängt der serielle Port einige Daten und ruft 'sp_DataReceived' auf, wodurch der Barcode-Text an die Textbox angehängt wird. –

+1

macht völlig Sinn. Das war sehr hilfreich. Vielen Dank Jason. – MarshallTrufant