稳定的蓝牙串行通信的波特率

时间:2012-01-31 19:07:51

标签: c# bluetooth serial-port arduino bluesmirf

我有一个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读取的数据中会出现相当大的滞后。我注意到这一点是因为我正在发送按钮状态,它们只是在我实际按下或释放aurduino上的按钮后几秒钟更改。我使用了蓝牙设备的标准波特率,即115200,并且想知道如果将其更改为更低的速率可以产生更好的结果吗?如果有任何优势会怎样?我不需要高通信率,即使每次更新状态4-5次也可以接受我的申请。

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

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

感谢您的帮助!

致以最诚挚的问候,

本德

更新

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

  1. 通过蓝牙连接时(通过USB线完全没有延迟)
  2. 当从PC建立第二个蓝牙连接到另一个设备(不同的COM端口和不同的波特率)时
  3. 是否有人在PC上的同一个蓝牙适配器上运行两个不同的设备?我可以设法连接到两个都没有问题,但仍然有前面提到的滞后问题。

    感谢您的帮助

1 个答案:

答案 0 :(得分:3)

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

对于一件事,实际的通信设置并不重要。在这种情况下,波特率毫无意义,蓝牙无线电信号设置传输速率。驱动程序将接受您选择的任何内容,否则将忽略它。可以解释握手信号 ,这取决于驱动程序实现它们。通信错误报告很少实现,BlueTooth具有纠错协议,与实际串行端口不同。

不,这里的数据丢失完全是自我诱导的。显然驱动程序 实现DiscardInBuffer()。除了扔掉司机收到的任何数据之外什么都不做。如果您的代码运行稍晚或被线程上下文切换中断,则会出错。

删除DiscardInBuffer()调用。