2014-11-25 48 views
0

我正在開發一個小程序,它從串口接收模擬數據並將其顯示到多個文本框中。 數據是來自微型的10位A2D,以兩個十六進制字節的形式和一個字母來標識它來自哪個A2D端口。處理和顯示來自串口的數據 - C#

例如:0x1A的,0×02,A

我的程序接收到的數據確定,並且如果我只顯示在正常工作時間接收模擬值。 我遇到的問題是,當我嘗試接收多個A2D值時,我不確定如何處理傳入數據。

下面的代碼假設在單獨的文本框中顯示3個模擬值,但只有第一個文本框顯示任何數據。什麼是最好的方法去做到這一點?

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    //Initialize a buffer to hold the received data 
    byte[] buffer = new byte[serialPort1.ReadBufferSize]; 

    int bytes = serialPort1.BytesToRead; 

    //There is no accurate method for checking how many bytes are read 
    //unless you check the return from the Read method 
    bytesRead = serialPort1.Read(buffer, 0, bytes); 

    nValue = buffer[0] + (buffer[1] << 8); 
    switch1 = Convert.ToChar(buffer[2]); 
    switch (switch1) 
    { 
     case 'A': 
      DispString1 = nValue.ToString(); 
      this.Invoke(new EventHandler(textBox0_TextChanged)); 
      break; 
     case 'B': 
      DispString2 = nValue.ToString(); 
      this.Invoke(new EventHandler(textBox1_TextChanged)); 
      break; 
     case 'C': 
      DispString3 = nValue.ToString(); 
      this.Invoke(new EventHandler(textBox2_TextChanged)); 
      break; 
    } 
} 

private void textBox0_TextChanged(object sender, EventArgs e) 
{ 
    textBox0.Text = DispString1; 
} 


private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    textBox1.Text = DispString2; 
} 

private void textBox2_TextChanged(object sender, EventArgs e) 
{ 
    textBox2.Text = DispString3; 
} 
+0

接收數據的格式是什麼? ''serialPort1.Read'方法之上的註釋非常重要,但是代碼並沒有實現任何處理這個事實,即在收到完整的數據包之前幾乎肯定會調用你的方法。 – 2014-11-25 09:57:47

+0

隨着調試器運行,我可以看到所有已收到。格式爲低字節,高字節,ASCII字符,0x1A0x0200x42。 – Chris 2014-11-25 10:34:48

+0

Hans Passant下面的答案是正確的 - 嘗試讓通訊工作起來,你會有很多樂趣。一旦你有一個完整的數據包,你應該考慮把'Invoke'調用改成'this.Invoke(new Action(()=> {textBox1.Text = nValue.ToString();}));'或類似的東西。 – 2014-11-25 12:03:59

回答

1
bytesRead = serialPort1.Read(buffer, 0, bytes); 

你盲目地以爲你會得到3個字節,使代碼工作需要休息。這不是串口如何工作。實際上你通常只能得到1或2個字節,串口很慢。所以當然你的switch()語句不能得到一個匹配。

人頭用:

byte[] buffer = new byte[3]; 
int len = 0; 
while (len < 3) { 
    len += serialPort1.Read(buffer, 0, 3-len); 
} 
// etc.. 

請注意,您有一個棘手的同步問題。如果調用Open()方法,而設備正在發送,則接收的第一個字節不一定是3字節響應的第一個字節。你永遠不會得到適當的迴應。設備通常會發送額外的字節來指示數據幀的開始和結束,以幫助解決該問題,但似乎並非如此。在設備端固定這應該是一個強有力的目標。

+0

謝謝你們的幫助,現在它工作得很好。 – Chris 2014-11-28 11:29:29