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

C# Reading an API frame received from an 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 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 循环。

byte/frames 将始终是固定大小。

任何输入将不胜感激。

您需要对帧进行更多的解析。 XBee 模块将生成其他帧类型,因此您需要观察帧的 0x7E 开头,解析帧长度和帧类型,甚至可能需要在处理数据之前验证校验和。

应该有一个串口API用于以特定的波特率打开串口然后reading/writing个字符。作为 Open Source library I created for interfacing with XBee modules. If you can't find anything in the C# docs for serial ports, maybe you can make use of the Win32 API I'm using (see xbee_serial.c).

的一部分,我在 C 中完成了它

更新:

在典型的设置中,您保留一个包含部分帧的缓冲区,直到您有一个完整的帧供处理。定期调用 serialPort1.Read()(每 100 毫秒一次——取决于您想要的响应速度)并向缓冲区添加字节。它可能会返回它实际读取的字节数,因此您可以跟踪您在缓冲区中的位置。

一旦你有了一个完整的框架,然后你将它交给你的函数来解析它并对内容进行操作。

如果您使用的是 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;
        }
        
  }