我有一个表单,我可以在其中接收数据并在richtextbox中显示它,但我需要的是读取连续来自串行端口的数据并进行相应的解码。
例如:我以格式接收数据,格式为36 0 0 0 1 0 0...., 36
用于表示帧的开始n rest是用于触发事件的数据。
我的代码:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
// get number off bytes in buffer
Bytenumber = serialPort1.BytesToRead;
// read one byte from buffer
ByteToRead = serialPort1.ReadByte();
this.Invoke(new EventHandler(DoUpdate));
}
以上代码用于接收数据并触发事件。该事件的代码如下:
int w=0;
public void DoUpdate(object sender, System.EventArgs e)
{
byte[] t = new byte[Bytenumber];
for(int g=0; g<Bytenumber;g++)
{
t[g] = Convert.ToByte(ByteToRead);
}
w++;
// richTextBox1.Text += ByteToRead;
if (ByteToRead == 36)
{
for (int r = 0; r <= 73; r++)
{
if (ByteToRead == 0x01)
{
timer1.Start();
w++;
}
}
}
}
在收到数据的事件处理程序中,我正在寻找36
(即帧的开始),一旦我得到它,我正在寻找缓冲区中的1。问题是当我得到36
(即帧的开始)时,相同的数据保留在if循环中并尝试与1进行比较,这在任何情况下都不是真的。我需要的是在我得到36之后读取来自缓冲区的下一个数据字节。
答案 0 :(得分:1)
我可以发现一些问题。一点点代码审查:
Bytenumber = serialPort1.BytesToRead;
ByteNumber是此时的Bytes-to-Read。将其保存在成员字段中不是线程安全的。
ByteToRead = serialPort1.ReadByte();
这只读取1个字节。然后,在另一个线程上:
byte[] t = new byte[Bytenumber]; // ByteNumber may have changed already
for(int g=0; g<Bytenumber;g++)
{
t[g] = Convert.ToByte(ByteToRead); // store the _same_ byte in all elements
}
你应该做什么(不是完整的代码):
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
// get number off bytes in buffer
int n = serialPort1.BytesToRead;
byte[] buffer = new byte[n];
// read one byte from buffer
int bytesToProcess = serialPort1.Read(buffer, 0, n);
this.Invoke(UpdateMethod, buffer, bytesToProcess);
}
但是要在互联网上搜索工作代码。我刚刚做了这个。