从串行端口读取字节

本文关键字:字节 读取 串行端口 | 更新日期: 2023-09-27 18:28:40

我已经编写了代码,从串行端口以字节数组的形式读取数据,并将其显示在文本框中。代码编译良好,但无法正常工作:

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中(使用SynchronizaContext.Post方法)。

接下来,在SerialPort类的DataReceived事件上注册并在那里进行读取(再次封装在同一SynchronizationContext对象中,否则串行端口读取/写入将超时)

干杯,