1、event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) 这个事件的引用的地方为 myBuf = signal Receive.receive[myType](myBuf, myBuf, mySize);;在SerialDispatcherP.nc这个组件中引用的!!
2.整个串口接受与发送分为五部分:分派组件(SerialDispatcherP.nc)、协议组件(SerialP.nc)、编码与装帧组件(HdlcTranslateC.nc)、原始串口组件(UartC.nc)、主动消息层组件(SerialActiveMessageC.nc),(C:\cygwin\opt\tinyos-2.x\tos\lib\serial和平台文件中)
分派组件(SerialDispatcherP.nc):
提供各种不同包头的消息发送和接收 组件,并获得不同包的包的信息。
协议组件(SerialP.nc ):
从节点到pc,负责封装上层组件需要发送的消息包;从pc到节点也是需要协议组件,进行接收同步与CRC检验,若接受同步且CRC校验通过,则节点会接受此数据包,反之丢弃!!提供SendBytePacket.nc.nc和ReceiveBytePacket.nc这两个接口,进行数据的发送与接收!!
编码与装帧组件(HdlcTranslateC.nc):
该组件主要是负责串口协议中的编码和装帧,就是将原始串口组件上接收到的数据进行编码和装帧,这个组件使用SerialByteComm接口并提供SerialFrameComm接口,串口协议采用的是HDLC帧格式进行装帧的。将装帧完的帧给协议组件再给分派组件进行分发!!
原始串口组件(UartC.nc)
:
主要负责数据的接收,提供不同的接收和发送的接口。
主动消息层组件(SerialActiveMessageC.nc):
负责将SerialActiveMessageP.nc和SerialPackerInfoActiveMessageP.nc与SerialDispatcherC.nc组件连接起来!是一个与平台无关的主动消息组件!并不提供接收数据包的校验!!
3.产生CRC校验的代码(C语言)
#include
typedef unsigned short u16_t;
typedef unsigned char u8_t;
u16_t crcByte(u16_t crc, u8_t b);
int main(void)
{
u8_t data[]={0x44,0x01,0x00,0xFF,0xFF,0x00,0x00,0x04,0x00,0x89,0x01,0x02,0x03,0x04};//44 09 00 FF FF 00 00 04 00 89 01 02 03 04
u16_t len=0;
int i;
for(i=0; i<14; i++)
{
len = crcByte(len, data[i]);
}
printf("%x\n",len);
}
u16_t crcByte(u16_t crc, u8_t b) {
crc = (u8_t)(crc >> 8) | (crc << 8);
crc ^= b;// //
crc ^= (u8_t)(crc & 0xff) >> 4;
crc ^= crc << 12;
crc ^= (crc & 0xff) << 5;
return crc;
}
/*
u16_t crcByte(u16_t crc, u8_t b)
{
u8_t k;
crc = crc ^ b << 8;
k = 8;
do
if (crc & 0x8000)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
while (--k);
return crc;
}*/
//可发送的数据包
//7E 44 09 00 FF FF 00 00 04 00 89 01 02 03 04 45 0A 7E
解释:
7E 是这个数据包的开头与结尾标志位,由
HdlcTranslateC.nc这个组件产生的帧字节。
44 是协议字节,代表的是发下去的数据是否需要应答信号,44表示需要应答的节点接收数据,45则表示节点发送的数据,与SerialP.nc这个组件有关。
09 这个是数据包发送下去需要反馈回来的序号字节,与SerialP.nc有关。
00 包格式的分派字节,与SerialDispatcherC.nc相关。
FF FF 00 00 04 00 89 01 02 03 04 这一段表示的是发送的payload数据段,其中包括FF FF发送的目的地址,00 00发送的源地址,04是发送数据长度,00 表示组号,89表示的是消息类型,01 02 03 04 表示真正有意义的数据,是节点需要接收的数据位。
45 0A 由CRC校验产生的校验位!!在tinyos中是CRC校验位的低位在前,高位在后!!
发送上来的数据:
7E 45 00 FF FF 00 00 04 00 89 01 02 03 04 78 88 7E
各个字段的意义与发下去的消息包的对应字段意义相同。
用来测试用的两个消息包!!
//7E 44 00 00 FF FF 00 00 04 00 89 01 02 03 04 7C 44 7E
//7E 44 01 00 FF FF 00 00 04 00 89 01 02 03 04 1F 01 7E