无法检索完整的串行数据
Unable to retrieve complete serial data
我正在开发一个个人项目来读取 Arduino 的 RFID 标签。
当我阅读第一个标签时;我收到了总字节数并且信息得到了正确处理。
但是在阅读以下时间时;似乎我的 PC 是 "seeing" 接收到的第一个字节(共 8 个字节)的接收事件;然后对一次接收到的数据进行处理; (当缓冲区中只有 6 个字节时)。
在发送了这 6 个要处理的字节之后,它注意到一个新的字节传入并处理它,以及随后的字节;在 6 字节和 2 字节的两条消息中创建结果。
结果示例:
1st Read: Message: 06DB0934
2nd Read: Message 1: 06
2nd Read: Message 1: DB0934
下面是我谦虚的代码:
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (port.IsOpen)
{
byte[] data = new byte[1024];
int bytesRead = port.Read(data, 0, data.Length);
idTag = Encoding.ASCII.GetString(data, 0, bytesRead);
// Custom Event that will update Information on Main Form
OnTagReceived();
}
}
知道如何解决这个问题吗?
由于这是在接收到的数据中,您需要将传入的字节存储在缓冲区中,直到您读取足够多为止。
将缓冲区作为 global/instance 变量分开,
private string _tagBuffer;
然后在你的方法中
if (port.IsOpen)
{
byte[] data = new byte[1024];
int bytesRead = port.Read(data, 0, data.Length);
_tagBuffer += Encoding.ASCII.GetString(data, 0, bytesRead);
if (_tagBuffer.Length >= 8)
{
idTag = tagBuffer.substring(0, 8);
tagBuffer = tagBuffer.substring(8); // might be 9
OnTagReceived();
}
}
将标签放在发送给事件的参数中而不是放在 idTag
中可能更好。
我正在开发一个个人项目来读取 Arduino 的 RFID 标签。 当我阅读第一个标签时;我收到了总字节数并且信息得到了正确处理。 但是在阅读以下时间时;似乎我的 PC 是 "seeing" 接收到的第一个字节(共 8 个字节)的接收事件;然后对一次接收到的数据进行处理; (当缓冲区中只有 6 个字节时)。 在发送了这 6 个要处理的字节之后,它注意到一个新的字节传入并处理它,以及随后的字节;在 6 字节和 2 字节的两条消息中创建结果。
结果示例:
1st Read: Message: 06DB0934
2nd Read: Message 1: 06
2nd Read: Message 1: DB0934
下面是我谦虚的代码:
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (port.IsOpen)
{
byte[] data = new byte[1024];
int bytesRead = port.Read(data, 0, data.Length);
idTag = Encoding.ASCII.GetString(data, 0, bytesRead);
// Custom Event that will update Information on Main Form
OnTagReceived();
}
}
知道如何解决这个问题吗?
由于这是在接收到的数据中,您需要将传入的字节存储在缓冲区中,直到您读取足够多为止。
将缓冲区作为 global/instance 变量分开,
private string _tagBuffer;
然后在你的方法中
if (port.IsOpen)
{
byte[] data = new byte[1024];
int bytesRead = port.Read(data, 0, data.Length);
_tagBuffer += Encoding.ASCII.GetString(data, 0, bytesRead);
if (_tagBuffer.Length >= 8)
{
idTag = tagBuffer.substring(0, 8);
tagBuffer = tagBuffer.substring(8); // might be 9
OnTagReceived();
}
}
将标签放在发送给事件的参数中而不是放在 idTag
中可能更好。