从串行端口读取字节
本文关键字:字节 读取 串行端口 | 更新日期: 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对象中,否则串行端口读取/写入将超时)
干杯,