我编写了代码,用于从串行端口读取数据作为字节数组,并将其显示在文本框中。代码编译正常,但无法正常工作:
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();
}
}
答案 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对象中,否则在串口读/写时会出现超时)
干杯,