从串口读取字节数

时间:2013-08-22 10:26:17

标签: c# 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();
    }
}

3 个答案:

答案 0 :(得分:3)

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

bytes 始终为零。除非你调试这个代码并单步执行它以减慢速度。使用WriteLine()写入的字节需要一段时间才能传输。设备处理它们需要时间。收到回复需要时间。这相当于几毫秒。

你需要通过循环来解决这个问题,重复调用Read()方法,直到你得到完整的响应。如果你正确设置了SerialPort.NewLine属性,你就会有一些简单的调用ReadLine()就足以解决你的问题了。

答案 1 :(得分:1)

你这是错误的做法。

单击按钮将打开serialPort1;当然。然后它会尝试读取缓冲区。但是你只用同样的方法打开了端口!

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

它将引导您完成C#中的所有串行通信。您当然不希望仅在按钮按下事件处理程序上打开和读取端口。

答案 2 :(得分:1)

使用button2事件将数据发送到端口。将所需的代码(用于发送数据)放入SynchronizationContext(使用SynchronizationContext.Post方法)。

接下来,在SerialPort类的DataReceived事件上注册并在那里进行读取(再次包含在同一个SynchronicationContext对象中,否则在串口读/写时会出现超时)

干杯,