2013-08-22 203 views
2

我已經編寫了從串口讀取數據作爲字節數組並將其顯示在文本框中的代碼。代碼編譯正常,但無法正常工作:從串口讀取字節

private void button2_Click(object sender, EventArgs e) 
{ 
    if (serialPort1.IsOpen == false) 
     serialPort1.Open(); 
    serialPort1.WriteLine(textBox1.Text); 
    int bytes = serialPort1.BytesToRead; 
    byte[] byte_buffer = new byte[bytes]; 
    serialPort1.Read(byte_buffer, 0, bytes); 
    //textBox2.Text = " "; 
    for (int t = 0; t < bytes; t++) 
    { 
     textBox2.Text += (byte_buffer[t]).ToString(); 
    } 
} 
+1

你有調試過嗎? textBox1.Text中是否有價值? 另外你如何創建串行端口?串口端口=新串口( 「COM1」,9600,Parity.None,8,StopBits.One); ETC ... – Pogrindis

+1

_「代碼無法正常工作」_ - 解釋原因,顯示輸入和輸出以及您希望發生的事情。 – CodeCaster

+0

yes.i已經使用SerialPort port = new SerialPort(「COM1」,9600,Parity.None,8,StopBits.One)創建了串口。有時在textbox1沒有價值,有時錯誤的價值「的代碼無法正常工作」的意思是:例如,當我在鍵盤上按「s」我看不到它在textbox1中的值。 –

回答

1

使用button2事件將數據發送到端口。將所需的代碼(用於發送數據)放入SynchronizationContext(使用方法SynchronizationContext.Post)。

接下來,註冊在SerialPort類的DataReceived事件檢索,做閱讀有(再次封閉到同一SynchronicationContext對象,否則你會得到串口讀取/寫入超時)

乾杯,

3
serialPort1.WriteLine(textBox1.Text); 
    int bytes = serialPort1.BytesToRead; 

字節值將總是爲零。除非你調試這個代碼,並且單步調整它來減慢速度。使用WriteLine()編寫的字節需要傳輸時間。設備處理它們需要時間。收到回覆需要時間。這增加了很多毫秒。

您需要通過循環來解決這個問題,重複調用Read()方法直到獲得完整響應。如果您正確設置了SerialPort.NewLine屬性,那麼您將會有一些可能性,只需調用ReadLine()就足以解決您的問題。