【发布时间】: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() 是因为我不关心过时的数据,只想跳过它。更重要的是,我正在阅读最新数据并根据这些新数据采取行动。
感谢您的帮助!
最好的问候,
本德尔
更新:
刚刚在调试时发现了更多信息。问题似乎才出现:
- 通过蓝牙连接时(通过 USB 电缆绝对没有延迟)
- 当从 PC 建立第二个蓝牙连接到另一台设备时(不同的 COM 端口和不同的波特率)
有没有人有在 PC 上使用同一个蓝牙加密狗运行两个不同设备的经验?我可以设法连接到这两个没有问题,但仍然有前面提到的滞后问题。
感谢您的帮助
【问题讨论】:
-
你用什么来触发receiveCommandHC()的调用?该循环很可能正在接收命令,但在此延迟期间,串行端口正在缓冲接下来的几个传入消息。首先读取最旧的味精,丢弃较新的味精。一个快速的调试实验是注释掉丢弃,只是为了验证新的消息是否是被丢弃的消息。我暂时保持相同的波特率。
-
您好,感谢您的回复,我正在使用每 50 毫秒触发一次的计时器来读取传入数据。
-
奇怪的是 SerialPort 在打开端口时正在发送 DTR 信号。将此明确设置为 false。
-
@leppie 对不起,伙计,我不太清楚你想在这里告诉我什么?
标签: c# bluetooth serial-port arduino bluesmirf