簡體   English   中英

從串口讀取字節

[英]Read bytes from serial port

我編寫了代碼,以從串行端口讀取數據作為字節數組並將其顯示在文本框中。 該代碼可以很好地編譯,但是不能正常工作:

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();
    }
}
  serialPort1.WriteLine(textBox1.Text);
  int bytes = serialPort1.BytesToRead;

字節值將始終為零。 除非您調試此代碼並單步執行以降低速度。 用WriteLine()寫入的字節要花費一些時間。 設備需要花費一些時間來處理它們。 接收響應需要時間。 這總計要花費許多毫秒。

您需要通過循環來解決此問題,重復調用Read()方法,直到獲得完整的響應為止。 如果正確設置了SerialPort.NewLine屬性,那么您可能會感到奇怪,只需調用ReadLine()就可以解決您的問題。

您正在以錯誤的方式進行操作。

點擊一個按鈕將打開serialPort1; 當然。 然后它將嘗試讀取緩沖區。 但是您只能以相同的方法打開端口!

看一下本教程: http : //www.dreamincode.net/forums/topic/35775-serial-port-communication-in-c%23/

它帶您完成C#中的整個串行通信。 您當然不希望僅在按鈕按下事件處理程序上打開和讀取端口。

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

接下來,在SerialPort類的DataReceived事件上注冊並在那里進行讀取(再次封裝在同一個SynchronicationContext對象中,否則串行端口讀取/寫入將超時)

干杯,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM