2013-04-24 28 views
0

我正在嘗試從串行端口讀取字節並將它們作爲字符串寫入文本框。serialport單獨讀取每個字符

我的問題是,代碼將每個字母/字符單獨寫入框中,而不是一個長字符串,所以如果我收到「你好」,它將寫入「H」,然後清除框,然後「e」。 .etc

public partial class Form1 : Form 
    { 
     static SerialPort serial; 
     public string line; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 



     private void Form1_Load(object sender, EventArgs e) 
     { 
      inputBox.Text = "Enter some text, then press enter"; 

      serial = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One); 
      serial.Open(); 

      serial.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived); 
     } 



     public void serial_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 

      // wait for the buffer 
      System.Threading.Thread.Sleep(300); 

       byte[] bytes = new byte[serial.BytesToRead]; 
       serial.Read(bytes, 0, bytes.Length); 

       line = System.Text.Encoding.UTF8.GetString(bytes); 

      if (line != null) 
      { 
       writeRecieved(line); 
      } 
     } 


     public void writeRecieved (string line) 
     { 
      if (outputBox.InvokeRequired) 
      { 
       outputBox.Invoke((MethodInvoker)delegate { outputBox.Text = line; }); 
      } 
      else 
      { 
       outputBox.Text = line; 
      } 
     } 

然而,當調試,這似乎只擊中每行的內容一次,和本地視圖顯示了可變線爲「Hello」的

編輯: 我試圖追加( outputBox.Text + = line;),但是每次收到新消息時,文本框都會填充文本。我試着把一個outputBox.Clear();在datarecieved處理程序中,但它在每個字節出於某種原因後執行此操作

+0

爲什麼不追加字符而不是替換整個文本字符串..?爲什麼不用'outputBox.Text + = line'來代替? – Artless 2013-04-24 18:48:23

回答

2

您的計算機能夠以比9600 bps更快的速度讀取數據。當它調用serial.Read時,它將讀取與當時的緩衝區中可用的字符數。

所以你要麼繼續閱讀,直到你得到一個換行符,或者按照評論中的建議進行操作,並將閱讀的文本附加到文本框中。

迴應你在評論中的問題,你所要求的是不可能的。接收者無法知道發件人何時完成發送所有數據,除非發件人包含某些文本結尾字符。發件人可能會發送"Hello",然後立即按"World"發送。數據逐字符接收。除非發送者在每個單詞後發送某種終止符,否則它只是接收器的一串字節。

是的,Thread.Sleep是效率低下,不應該用於這種事情。

通常,這種事情是通過讓發件人在每行的末尾添加換行符來處理的。然後接收器可以讀取字符並在新行上拆分接收到的文本以導出行。使用Sleep也會讓你陷入麻煩。假設發件人發送"Hello",然後發送"World",由於某種原因,您的線程睡眠時間可能爲4320毫秒(可能發生在繁忙的系統上)而不是300,並且您會收到"HelloWo"作爲第一個單詞。哎呀。

+0

有沒有辦法檢查datarecieved事件何時完成,從而緩衝區已滿?當前的「System.Threading.Thread.Sleep(300);」效率不高 – Wayneio 2013-04-24 19:12:06

+0

@Wayneio:查看我更新的答案。 – 2013-04-24 19:29:19

+0

非常感謝,非常有用,學到了很多東西。我將Environment.NewLine添加到發送的字符串的末尾,然後使用serial.ReadLine();以確保我得到了很多。 – Wayneio 2013-04-25 20:25:55

相關問題