tinyos 串口通信
2015-10-18 10:34
169 查看
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校验位的低位在前,高位在后!!
发送上来的数据:
[align=left]7E 45 00 FF FF 00 00 04 00 89 01 02 03 04 78 88 7E[/align]
[align=left]各个字段的意义与发下去的消息包的对应字段意义相同。[/align]
用来测试用的两个消息包!!
//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
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校验位的低位在前,高位在后!!
发送上来的数据:
[align=left]7E 45 00 FF FF 00 00 04 00 89 01 02 03 04 78 88 7E[/align]
[align=left]各个字段的意义与发下去的消息包的对应字段意义相同。[/align]
用来测试用的两个消息包!!
//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
相关文章推荐
- Bootstrap 下拉菜单
- auto_ptr智能指针
- 简单二叉树的创建,连接树结点,二叉树的深度(转载)
- java--通过DOM4J方式生成rss文件简单实例
- 04-06组合数学实践_交通问题
- 使用批处理文件
- 算法录 之 BFS和DFS
- How to translate virtual to physical addresses through /proc/pid/pagemap
- 遗传基因科普(1):遗传基因是什么?
- 使用魔术方法实现跨文件调用
- hdu 1503 Advanced Fruits 公共子序列
- 软件架构设计之常用架构模式介绍
- C#属性
- ARM体系架构之——处理器工作模式
- Apache下开启SSI配置使html支持include包含
- 汉语字典技术文档
- Linux 产能工具及其使用技巧
- [jetty] lost connection with Eclipse , shutting down.
- web服务器和app服务器
- 自学QT之QSS皮肤美化教程