我从XBee端点接收到通过com端口连接到我的计算机的XBee协调器的api帧。
我接收的这个API框架是在检测到更改时发送的更改检测(简单就绪)。此更改检测没有设置间隔。
当收到这个api框架时,我希望能够在我的C#应用程序中读取它,原因如下:
框架如下:7E 00 0A 83 00 00 1C 00 01 00 81 00 80 5E(第12个位置为80)我想表明灯已关闭。
框架如下:7E 00 0A 83 00 00 2B 00 01 00 81 00 81 4E(第12个位置为81)我想表明灯亮了。
我的代码非常简单 - 我所缺少的是在C#中保留框架。这是我的代码:
byte[] switch_indicator = somehow_read_the_frame;
if (switch_indicator[12] = 0x81)
{
textBox1_TextChanged.BackColor = System.Drawing.Color.Green;
}
if (switch_indicator[12] = 0x80)
{
textBox1_TextChanged.BackColor = System.Drawing.Color.Red;
}
我将如何获得这个框架?
我已经想过以某种方式从com端口获取它,但我不知道该怎么做。
任何想法或建议都将受到高度赞赏。
编辑:这是我的进步。
private void test_read_Click(object sender, EventArgs e)
{
byte[] buffer = new byte[14];
serialPort1.Read(buffer, 0, buffer.Length);
string buffer_string = BitConverter.ToString(buffer);
read_textbox.Text = buffer_string;
if (buffer[12] == 129)
{
textBox1.BackColor = System.Drawing.Color.Green;
}
if (buffer[12] == 128)
{
textBox1.BackColor = System.Drawing.Color.Red;
}
}
只要我按下开关,然后单击程序中的按钮,这就可以工作。如果我单击程序中的按钮而没有检测到更改(没有按下开关)程序等待这样的更改,然后它会读取它。但它读得不完整。我得到一个像7E 00 00 00 ... 00这样的帧。然后下一帧由于某种原因以7E结束并抵消它。
另外,如果我多次按下开关,然后点击我的按钮进行更新,我必须多次点击按钮才能进入最后一帧。
最终,我希望程序在检测到更改时更新颜色。不是通过手动按钮来检查,也不是使用大量不必要的资源无限运行的while循环。
字节/帧始终是固定大小。
非常感谢任何输入。
答案 0 :(得分:0)
您需要对帧进行更多解析。 XBee模块将生成其他帧类型,因此您需要注意帧的0x7E开始,解析帧长度和帧类型,甚至可能希望在处理数据之前验证校验和。
应该有一个串行API,用于以特定的波特率打开串口,然后读取/写入字符。我已经在C中完成了它作为我为与XBee模块接口而创建的Open Source library的一部分。如果您在C#docs中找不到串口的任何内容,也许您可以使用我正在使用的Win32 API(参见xbee_serial.c)。
更新
在典型设置中,保留带有部分帧的缓冲区,直到您有完整的帧进行处理。定期调用serialPort1.Read()
(每100毫秒 - 取决于你想要的响应速度)并将字节添加到缓冲区。它可能返回它实际读取的字节数,因此您可以跟踪缓冲区中的位置。
一旦你有一个完整的框架,然后你把它交给你的功能解析它并对内容采取行动。