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();
    }
}
4

3 回答 3

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

字节值将始终为零。除非您调试此代码并单步执行以减慢速度。传输您使用 WriteLine() 写入的字节需要时间。设备需要时间来处理它们。并且需要时间才能收到响应。这增加了很多毫秒。

您需要通过循环、重复调用 Read() 方法来解决此问题,直到获得完整响应。如果您正确设置了 SerialPort.NewLine 属性,那么您将有一些几率仅调用 ReadLine() 就足以解决您的问题。

于 2013-08-22T13:24:57.433 回答
1

你正在以错误的方式解决这个问题。

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

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

它将带您了解 C# 中的全部串行通信。您当然不想仅在按钮按下事件处理程序上打开和读取端口。

于 2013-08-22T10:32:38.957 回答
1

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

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

干杯,

于 2013-08-22T13:12:46.697 回答