【问题标题】:Baud rates for stable Bluetooth serial communication稳定蓝牙串行通信的波特率
【发布时间】:2012-01-31 19:07:50
【问题描述】:

我有一个通过蓝牙(bluesmirf gold 设备)与我编写的 C# 应用程序通信的 Arduino mega。 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 上使用同一个蓝牙加密狗运行两个不同设备的经验?我可以设法连接到这两个没有问题,但仍然有前面提到的滞后问题。

感谢您的帮助

【问题讨论】:

  • 你用什么来触发receiveCommandHC()的调用?该循环很可能正在接收命令,但在此延迟期间,串行端口正在缓冲接下来的几个传入消息。首先读取最旧的味精,丢弃较新的味精。一个快速的调试实验是注释掉丢弃,只是为了验证新的消息是否是被丢弃的消息。我暂时保持相同的波特率。
  • 您好,感谢您的回复,我正在使用每 50 毫秒触发一次的计时器来读取传入数据。
  • 奇怪的是 SerialPort 在打开端口时正在发送 DTR 信号。将此明确设置为 false。
  • @leppie 对不起,伙计,我不太清楚你想在这里告诉我什么?

标签: c# bluetooth serial-port arduino bluesmirf


【解决方案1】:

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

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

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

删除 DiscardInBuffer() 调用。

【讨论】:

  • 您好,感谢您抽出宝贵时间帮助我。我尝试删除 DiscardInBuffer() 因为我有预感它可能与此有关,但在进一步测试后发现这实际上会增加我的延迟?!即使设备与 USB 连接时,我注意到没有 DiscardInBuffer()...
  • DiscardInBuffer 只会造成麻烦。只是不要在另一端经常发送数据。或者仅在您的主应用请求时发送。
猜你喜欢
  • 1970-01-01
  • 2011-07-31
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
相关资源
最近更新 更多