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
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





     

你可能感兴趣的:(底端,串口通信,tinyos)