0

我有一个 Arduino mega 通过蓝牙(bluesmirf gold 设备)与我编写的 C# 应用程序通信。Arduino 不断发送 32 个字符的串行信号,第一个始终是“S”,最后一个是“E”。使用 putty,我可以确认 99% 的时间都正确发送了这个信号。

现在我想用我的 C# 应用程序读取这个信号,我正在使用以下代码:

    public string receiveCommandHC()
    {
        
        string messageHC = "";
        if (serialHC.IsOpen)
        {

            while (serialHC.ReadChar() != 'S')
            {

            }
            messageHC = serialHC.ReadTo("E");
            serialHC.DiscardInBuffer();
        }
        return messageHC;
         
    }

serialHC 属于串行类。

有时这工作得很好,但有时我遇到问题,我不知道为什么它有时会起作用,但其他时候却不行。

我似乎遇到的问题是,有时我从 arduino 读取的数据中会出现相当大的滞后。我注意到这一点是因为我正在发送按钮状态,并且它们仅在我实际按下或释放 Arduino 上的按钮后几秒钟发生变化。我使用了蓝牙设备的标准波特率,即 115200,并且想知道将其更改为更低的速率是否会产生更好的结果?如果有什么优势呢?我不需要高通信速率,即使每秒更新状态 4-5 次对于我的应用程序也是可以接受的。

延迟是否可能来自我的代码?我认为它可能来自等待传入“S”的while循环,但我不明白为什么它应该挂在那里,因为总是有新信号以高速率进入。

我使用 DiscardInBuffer() 因为我不关心过时的数据,只想跳过它。更重要的是,我正在阅读最新数据并根据这些新数据采取行动。

感谢您的帮助!

最好的祝福,

本德

更新:

刚刚在调试时发现了更多信息。问题似乎只出现:

  1. 通过蓝牙连接时(通过 USB 电缆绝对没有延迟)
  2. 当从 PC 建立第二个蓝牙连接到另一个设备时(不同的 COM 端口和不同的波特率)

有没有人有在 PC 上使用同一个蓝牙加密狗运行两个不同设备的经验?我可以设法连接到这两个没有问题,但仍然有前面提到的滞后问题。

谢谢你的帮助

4

1 回答 1

4

您在这里并没有真正使用物理串行端口。蓝牙驱动程序只是模拟一个。这很常见,Windows API 有一组定义良好的 api 函数来与串行端口通信。模拟一个使驱动程序的接口变得简单,供应商不必提供接口 DLL 或记录复杂的 DeviceIoControl() 协议。

这意味着一方面,实际的通信设置并不重要。在这种情况下,波特率毫无意义,设置传输速率的是蓝牙无线电信号。驱动程序将接受您选择的任何内容,否则将忽略它。握手信号可能会被解释,这取决于驱动程序来实现它们。通信错误报告很少实现,蓝牙有一个纠错协议,不像真正的串口。

不,这里的数据丢失完全是自我引起的。显然,驱动程序确实实现了 DiscardInBuffer()。除了丢弃驱动程序收到的任何数据之外,它什么也没做。如果您的代码运行有点晚或被线程上下文切换中断,这就会出错。

删除 DiscardInBuffer() 调用。

于 2012-02-02T13:41:42.977 回答