C#读取从XBee接收到的API帧

  • 本文关键字:API 读取 XBee c# api xbee
  • 更新时间 :
  • 英文 :


我收到一个从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;
        }
        
  }

最新更新