我正在编写一个真正的基本控制台应用程序,它会轮询几个串行端口的数据,并将结果保存到数据库中。
我最初的想法是打开端口,读取数据然后再次关闭它,问题是,打开串口最多可能需要4秒钟,我可能需要读取多达8个端口,因此打开关闭端口对每个循环都不实用。
串口设备很可能与打开的端口断开连接,当然这会导致问题。
因此可以检测端口是否处于打开和活动状态,这样我就可以打开端口,只有当我检测到连接的设备已经消失时才关闭并重新打开它。
串口是蓝牙串口,它与蓝牙无线电通话,后者又与微控制器对话。我有开始和结束的字符,我听,所有这一切都很好,直到蓝牙设备超出范围并有效断开连接,使串口仍然打开。
我当然可以关闭端口并尝试再次打开它,但我想检测设备是否仍然连接到蓝牙串口。
另外,在OSX上的串口上调用serial.close()会导致瞬间冻结(桌面游标冻结),我怀疑100%的cpu使用率,这不会发生在Windows上,因此我想最小化端口数量打开和关闭我必须做的事情,因为我每分钟从大约10个蓝牙设备轮询数据。
由于打开串口需要4秒钟,最好的解决方案是使用直接HID连接到蓝牙无线电而不是SPP串行连接,但似乎没有人将realbasic连接到蓝牙之前的HID设备,所以没有任何信息或帮助。
答案 0 :(得分:1)
您的请求有点奇怪,因为您通常所做的是连接到串行端口,然后等待接收发送到该端口的任何数据。让我换一种说法。连接时,串口不会存储任何等待为您输出的数据。你是在听还是不听。
您必须连接到端口并侦听数据。收到DataAvailable事件后,您可以开始处理数据,但请注意,在事件发生之前,可能未收到并处理流中的所有数据。您通常需要确定消息的结束。有时这是Carraige Return,有时候不是。取决于系统。
的DataAvailable的更多信息答案 1 :(得分:1)
自从我在RB中进行串行编程已经有几年了,所以我不记得所有内容。
Serial类有一个“LineStateChanged”事件。您是否检查过BT conn丢失或重新连接后是否会调用它?
如果这不起作用,您可以尝试使用低级BSD / POSIX函数打开端口并使用ioctl()调用来确定其状态。不过,我没有任何例子。我甚至不确定这是正确的方法。它可能归结为学习C程序将做什么,并将其转换为RB。
关于糟糕的性能:这通常是由于RB对其事件管理的有限控制:它没有看到它需要更频繁地轮询串行端口,因此只要它没有其它就很少检查它从操作系统请求更多空闲时间的原因。 诀窍是运行高频率的定时器(例如每10ms一次),然后从Timer的Action事件中调用串口的Poll功能。