我收到一个从XBee端点到XBee协调器的api帧,该协调器通过com端口连接到我的计算机。
我收到的这个API帧是一个变化检测,当检测到变化时就会发送(简单地说)。此更改检测没有设置间隔。
当收到这个api帧时,我希望能够在我的C#应用程序中读取它,原因如下:
当框架是这样的:7E 00 0A 83 00 00 1C 00 01 00 81 00 80 5E(第12个位置是80)时,我想指示灯熄灭。
当框架是这样的时候:7E 00 0A 83 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循环。
字节/帧将始终是固定大小。
任何意见都将不胜感激。
您需要对帧进行更多的解析。XBee模块将生成其他帧类型,因此您需要注意帧的0x7E开始,解析帧长度和帧类型,甚至可能需要在处理数据之前验证校验和。
应该有一个串行API,用于以特定的波特率打开串行端口,然后读取/写入字符。我在C中完成了这项工作,作为我创建的用于与XBee模块接口的开源库的一部分。如果您在C#文档中找不到串行端口的任何内容,也许您可以使用我正在使用的Win32 API(请参阅xbee_serial.C)
更新:
在典型的设置中,保留一个包含部分帧的缓冲区,直到有一个完整的帧进行处理。定期调用serialPort1.Read()
(每100ms一次——取决于您想要的响应速度),并向缓冲区添加字节。它可能会返回实际读取的字节数,因此您可以跟踪缓冲区中的位置。
一旦你有了一个完整的框架,你就把它交给你的函数来解析它并对内容进行操作。
如果您使用C#,您可以使用计时器工具运行代码来检查是否自动更改,如果更改,则自动更改颜色。
类似这样的东西:
private void tmrChecking_Tick(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;
}
}