600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > tinyos 串口通信

tinyos 串口通信

时间:2018-08-21 12:04:57

相关推荐

tinyos 串口通信

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<stdio.h> 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

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