使用 tinyos 时,有SerialForwarder将数据转发到套接字。我试图用 host:"localhost",,port="9001" 打开套接字,但这总是会返回两个字节 ="T!" !!
然后我尝试打开一个具有相同属性的 TCP 连接,但我收到了这个警告:
warning unsuccessful read a timeout occurred before the terminator was reached
如何从SerialForwarder读取数据?
使用 tinyos 时,有SerialForwarder将数据转发到套接字。我试图用 host:"localhost",,port="9001" 打开套接字,但这总是会返回两个字节 ="T!" !!
然后我尝试打开一个具有相同属性的 TCP 连接,但我收到了这个警告:
warning unsuccessful read a timeout occurred before the terminator was reached
如何从SerialForwarder读取数据?
你必须彻底阅读串行堆栈......它不是很容易,但它确实可以。
可以直接从串口读取。在这种情况下,您不需要串行转发器。有几件事情需要照顾。
例如,如果您想读取发送到 PC 串行端口的串行消息(USB 传感器板就像串行一样工作,因为它们使用 USB 到串行转换器,如 FTDI 芯片)。
在 C#(Java 等)中,您可以读取串行端口中的字节流。您可以解析此字节流以提取 tinyos 的标准串行消息。
这在TEP #113中以某种方式进行了解释,尽管它存在一些问题,但是您应该能够找到这些问题并使您的程序正常工作。
正如 TEP 113 中所述,标准串行数据包类似于:
7e 40 09 00 是 05 7d 5d 06 01 02 03 04 05 7e
这意味着,一个数据包以十六进制7E
(我相信它的 126 或 127)开头,也以7E
. 最后 2 个字节是CRC
数据包。因此,您可以在您的 c# 程序中在遇到流时开始从串行端口7E
读取,并在到达流中的下一个时停止读取7E
。介于两者之间的一切都将是您的数据包。
您必须注意的escaping
是,如果 a7E
是您的数据包内容的一部分,请不要与开始和结束直径计混淆,它将被转义为其他内容......这也在 TEP 113 中进行了解释。
我相信有一些 C++ 代码用于计算 CRC,您可以轻松地将其转换为 C# 或 Java 代码。
还要检查源代码,Serial.h
其中包含有关如何在 TinyOS 中形成串行数据包的一些详细信息。