3

我正在编写一个 realbasic 控制台应用程序,它轮询多个串行端口的数据并将结果保存到数据库中。

我最初的想法是打开端口,读取数据然后再次关闭它,问题是,打开一个串行端口可能需要 4 秒,我可能需要从多达 8 个端口读取,所以打开和关闭端口对每个周期都不实用。

串行设备很可能与打开的端口断开连接,这当然会导致问题。

那么是否可以检测一个端口是否打开并处于活动状态,以便我可以让端口保持打开状态,只有在我检测到连接的设备已经消失时才关闭并重新打开它。

编辑

串口是蓝牙串口,它与蓝牙无线电通信,而蓝牙无线电又与微控制器通信。我有我听的开始和结束字符,所有这些工作正常,直到蓝牙设备超出范围并有效断开连接,而串口仍然打开。

我当然可以关闭端口并尝试再次打开它,但我想检测设备是否仍然连接到蓝牙串口。

此外,在 OSX 上的串行端口上调用 serial.close() 会导致暂时冻结(桌面光标冻结),我怀疑 100% 的 CPU 使用率,这不会发生在 Windows 上,因此我想尽量减少端口打开和关闭的数量我必须这样做,因为我每分钟轮询一次来自大约 10 个蓝牙设备的数据。

由于打开串口最多需要 4 秒,最好的解决方案是使用与蓝牙无线电的直接 HID 连接而不是 SPP 串行连接,但似乎之前没有人将 realbasic 连接到蓝牙 HID 设备所以没有任何信息或帮助。

4

2 回答 2

1

您的请求有点奇怪,因为通常您所做的是连接到串行端口,然后等待接收发送到该端口的任何数据。让我换一种说法。当您连接时,串行端口不会存储任何等待为您吐出的数据。你要么在听,要么不在。

您必须连接到端口并侦听数据。收到 DataAvailable 事件后,您可以开始处理数据,但请注意,在事件发生之前,并非流中的所有数据都已被接收和处理。您通常需要确定消息的结尾是什么。有时这是一个 Carraige Return,有时不是。取决于系统。

有关 DataAvailable 的更多信息,请访问http://docs.xojo.com/index.php/Serial.DataAvailable

于 2013-06-15T22:43:03.787 回答
1

自从我在 RB 中进行串行编程已经有几年了,所以我不记得一切了。

Serial 类有一个“LineStateChanged”事件。您是否检查过 BT conn 丢失或重新连接后是否会调用它?

如果这不起作用,您可以尝试使用低级 BSD/POSIX 函数打开端口并使用 ioctl() 调用来确定其状态。不过,我没有任何例子。而且我什至不确定这是不是正确的方法。它可能归结为学习 C 程序会做什么,并将其转换为 RB。

关于糟糕的性能:这通常是由于 RB 对其事件管理的控制有限:它认为不需要更频繁地轮询串行端口,因此只要没有其他理由要求,它就很少检查它从操作系统获得更多空闲时间。诀窍是以高频率(例如每 10ms 一次)运行 Timer,然后从 Timer 的 Action 事件中调用串行端口的 Poll 函数。

于 2013-06-16T19:59:55.467 回答