600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > TinyOS之串口通信TestSerial数据包分析

TinyOS之串口通信TestSerial数据包分析

时间:2020-06-28 05:21:31

相关推荐

TinyOS之串口通信TestSerial数据包分析

目录

1.串口通信样例2.编译烧录程序3.获取节点发送的串口数据4.节点数据的简易分析5.crc校验方法6.接收与发送的区别

1.串口通信样例

本文以tinyos-2.1.1下的TestSerial样例程序为例;

其路径为/opt/tinyos-2.1.1/apps/tests/TestSerial

TestSerialAppC.nc

#include "TestSerial.h"configuration TestSerialAppC {}implementation {components TestSerialC as App, LedsC, MainC;components SerialActiveMessageC as AM;components new TimerMilliC();App.Boot -> MainC.Boot;App.Control -> AM;App.Receive -> AM.Receive[AM_TEST_SERIAL_MSG];App.AMSend -> AM.AMSend[AM_TEST_SERIAL_MSG];App.Leds -> LedsC;App.MilliTimer -> TimerMilliC;App.Packet -> AM;}

TestSerialC.nc

#include "Timer.h"#include "TestSerial.h"module TestSerialC {uses {interface SplitControl as Control;interface Leds;interface Boot;interface Receive;interface AMSend;interface Timer<TMilli> as MilliTimer;interface Packet;}}implementation {message_t packet;bool locked = FALSE;uint16_t counter = 0;event void Boot.booted() {call Control.start();}event void MilliTimer.fired() {counter++;if (locked) {return;}else {test_serial_msg_t* rcm = (test_serial_msg_t*)call Packet.getPayload(&packet, sizeof(test_serial_msg_t));if (rcm == NULL) {return;}if (call Packet.maxPayloadLength() < sizeof(test_serial_msg_t)) {return;}rcm->counter = counter;if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(test_serial_msg_t)) == SUCCESS) {locked = TRUE;}}}event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {if (len != sizeof(test_serial_msg_t)) {return bufPtr;}else {test_serial_msg_t* rcm = (test_serial_msg_t*)payload;if (rcm->counter & 0x1) {call Leds.led0On();}else {call Leds.led0Off();}if (rcm->counter & 0x2) {call Leds.led1On();}else {call Leds.led1Off();}if (rcm->counter & 0x4) {call Leds.led2On();}else {call Leds.led2Off();}return bufPtr;}}event void AMSend.sendDone(message_t* bufPtr, error_t error) {if (&packet == bufPtr) {locked = FALSE;}}event void Control.startDone(error_t err) {if (err == SUCCESS) {call MilliTimer.startPeriodic(1000);}}event void Control.stopDone(error_t err) {}}

TestSerial.h

#ifndef TEST_SERIAL_H#define TEST_SERIAL_Htypedef nx_struct test_serial_msg {nx_uint16_t counter;} test_serial_msg_t;enum {AM_TEST_SERIAL_MSG = 0x89,};#endif

2.编译烧录程序

cd /opt/tinyos-2.1.1/apps/tests/TestSerial //进入目录make telosb install //编译烧录

3.获取节点发送的串口数据

1)Ubuntu下的Listen监听

使用tinyos自带的Listen工具监听节点发送给我们的数据包

命令为:

java net.tinyos.tools.Listen -comm serial@/dev/ttyUSB0:telosb

其结果如下图所示:

2)windows下的串口工具监听

使用windows下的串口工具监听节点发送给我们的数据包

其结果如下图所示:

4.节点数据的简易分析

可以看出节点发送的真实数据包为:

7E 45 00 FF FF 00 00 02 00 89 00 F0 FE DB 7E

这与TinyOS的TEP技术文档中的TEP113中介绍的一致

即可以分解为如下几个部分:

7E 45 00 FF FF 00 00 02 00 89 00 F0 FE DB 7E

F 包头帧 7E 数据包的开头与结尾标志位

P 协议帧 45 代表数据是否需要应答信号,44表示需要应答的节点接收数据,45则表示节点发送的数据。在serial.h头文件中有定义SERIAL_PROTO_PACKET_NOACK = 69。

S 序号帧 序号字节,与SerialP.nc有关

 其中没有S位的原因见TEP的原文:

 SerialP uses SerialFrameComm to send a delimiter between frames, a serial-level type field, the bytes of the packet, and a two-byte frame CRC. For mote-to-host gap detection and link reliability, a sequence number may also be sent (not activated in the default implementation).

D 包类帧 00 包格式的分派字节,与SerialDispatcherC.nc相关,用于串口分发,AM消息默认为0,TOS_SERIAL_ACTIVE_MESSAGE_ID = 0

Payload 负载帧 FF FF 00 00 02 00 89 00 F0  表示的是发送的payload数据段

FF FF dest 目的地地址

00 00 src源地址,T2.0默认不填充该部分,所以为0

02 length就是后面data载荷长度

00 group 在T2.0中注释掉了,不填充,故为0

89 type

注意:7E->7D 5E,7D->7D 5D

CR 校验帧 FE DB  由CRC校验产生的校验位,低位在前,高位在后

F 包尾帧 7E

5.crc校验方法

uint16_t crcByte(uint16_t crc, uint8_t b) {crc = (uint8_t)(crc >> 8) | (crc << 8);crc ^= b;crc ^= (uint8_t)(crc & 0xff) >> 4;crc ^= crc << 12;crc ^= (crc & 0xff) << 5;return crc;}

6.接收与发送的区别

7E 45 00 X1 X2 00 00 X3 00 X4 Payload(AM) F1 F2 7E <<==PC上接收到的

7E 44 00 00 X1 X2 00 00 X3 00 X4 Payload(AM) F1 F2 7E <<==PC发往节点的

两点区别:

1,PROTO由45换成了44,44=SERIAL_PROTO_PACKET_ACK,由于T2.0中只支持ACK方式的接收

2,增加了分发字段 00 ,主要是由于在SerialP的接收状态机中增加了RXSTATE_TOKEN,且在触发SerialDispatcherC时,用于分发标识。反正固定写00下面就能正确接收了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。