新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > 点对多点多任务无线通信

点对多点多任务无线通信

——
作者:聂光义 时间:2005-10-19 来源: 收藏


  现代世界是一个高速自动化的世界,各种各样的设备除了可以与计算机联机外,还可以互相联机,而最简单的自动化联机方式就是使用串行通讯。随着时代的进步,它并没有被取代,反倒是逐渐被广泛应用。如今,在许多的场合有线连接的方式已经不能满足科技的高速发展。技术正以一种快速的速度进入许多产品,它与有线相比主要有成本低,携带方便,省去有线布线的烦恼。特别适用于手持设备的、电池供电设备、遥控、遥测、小型网络、抄表、门禁系统、小区传呼、工业数据采集系统、无线标签身份识别、非接触RF 智能卡、小型无线数据终端、安全防火系统、无线遥控系统、生物信号采集、水文气象监控、机器人控制、无线232 数据、无线485/422 数据、无线数字语音、数字图像传输、智能小区不停车收费、银行智能回单系统等。在如此多的无线系统应用中,无线通信的协议自然显得特别重要,无线通信协议的好坏直接关系到系统的安全性、误码率、以及系统运行的速度。本文以上海桑博科技有限公司的STR-2无线收发模块为例,详细介绍无线收发模块与各种单片机的硬件接口设计,无线通信协议的数据打包格式、解包程序以及相关软件设计。

系统概述

一.连状系统

  如图1系统由一台中央监控设备CMS (Central Monitoring System)和多台远程终端设备MRTU(Multiple Remote Termial Unit)构成多任务无线通信系统。在中央监控设备CMS 与 远程终端RTU(Remote Termial Unit)之间用多台中转设备Tran作为中转站,以便起到暂存数据和延伸距离的作用。中转站之间,以单向通信方式进行传递数据。

1.适用范围

a.适用于传输距离远的多点多任务数据采集

b.适用于条件恶劣干扰大多点多任务数据采集

c.适用于对时间要求不高的各种复杂无线数传

d.适用于智能小区水、电、煤、暖气集中抄表系统,各种远程集中安防报警系统等。

2.协议数据包格式

  协议的笫一件事就是能够识别噪声和有效数椐,噪声是以随机字节出现的,没有明显的结合方式,噪声源可能产生任意字节的组合,在无线通信的过程中最好能通过一种协议能有效的抑制噪声的产生

  通过测试和试验,发现0xFF 后跟0XAA,0x55 在噪声中不容易发生,传输协议应该在数据包前加开始字节0xFF 后跟0xAA,0x55发送协议的开始应该以一个任意内容的字节(这是因为第一个字节的数椐在发送时容易丢失),然后是0xFF 后跟一个0xAA,0x55;接收协议规定只接收以0xFF 后跟0xAA,0x55 开始的包.于是就可以很方便的把以上系统的数据包格式定为:

Lead1

Lead2

Lead2

Header

Length

HostID

Local

Destination

unit

Data1

Data2

●●●

Datan

Checksum

 

 

 

Lead 为引导字节

Leader1=0xFF;

Leader2=0xAA;

Leader2=0x55;

Header 为数据包的命令字节,由此确定数据包的类型

Length 为数据包包含的Length字节之后的所有字节的长度

HostID 为主机地址

Local  为本地机地址

Destination 目标地址

Unit   为RTU地址字节

Data   位数据包字节

Checksum 校验字节

二.    星状点对多点通信


  如图 2系统由一台中央监控设备CMS和多台远程终端设备MRTU构成点对多点多任务无线通信系统。在中央监控设备CMS 与 每一台远程终端RTU(Remote Termial Unit)都以双向通信方式进行传递数据。特别适用于数据量大,对时间要求较高的场合。

1. 适用范围

a. 适用于传输距离较近的地方

a.适用于条件恶劣干扰大的地方

b.适用于对时间要求高、数据量大的场合

c.适用于智能小区水、电、煤、暖气集中抄表系统,各种远程集中安防报警系统等

d.适用于智能家用集中控制系统

e.工业测控、工业数据采集

f. 医疗器械、健身器材

g.数据仓库、智能商场超市导购

h.餐饮无线点菜系统

i.PDA无线数传

j.水纹气象监控

k.生物信号采集

l.油田环境监控

m.银行智能回单系统等

2.协议数据包格式

根据图 2可以把系统的数据包格式定为:

 

Lead1

Lead2

Lead2

Header

Length

Unit

Data1

Data2

●●●

Datan

Checksum

 


 

Lead 为引导字节

Leader1=0xFF;

Leader2=0xAA;

Leader2=0x55;

Header 为数据包的命令字节,由此确定数据包的类型

Length 为数据包包含的Length字节之后的所有字节的长度

Unit   为RTU地址字节

Data   位数据包字节

Checksum 校验字节

硬件设计

 
  上海桑博电子科技有限公司STR-2 RF Module 的核心部分为nRF401,外加精心设计的内置天线,体积为37mm x 47mm,具有体积小,功耗低的特点,传输距离为200米,传输最大速率为20kbit/s,外围接口电路简单,可直接与单片机的通用串行总线(UART)口连接。如图3所示STR-2 RF Module 引脚功如下:

VCC:正电源,接2.7~5.25V

CS:  频道选择,CS=0选择工作频道1即433.92MHZ,CS=1选择工作频道2即433.33MHZ

DOUT:    数据输出,连接MCU串口RXD

DIN:数据输入,连接MCU串口TXD

GND:      电源地

PWR:      节能控制,PWR=1正常工作状态,PWR=0低功耗状态

TXN:发射接收控制,TXN=1时模块为发射状态,TXN=0时模块为接收状态

STR-2 RF Module 接口简单,本文将不作详细的叙述,如果想要详细的了解STR-2 RF Module, 请参照参考文献 1。

{{分页}}

软件设计

  在系统中所有STR-2 RF Module 均采用433.92MHZ作为系统工作频率。下面以星状点对多点通信系统为例,详细介绍系统的软件设计。

1.主程序设计

  为了避免同频干扰的问题,系统采用分时TDMA(Time Division Multiple Access)技术,把系统CMS与任意一台RTU之间的通信采用时分的方式分开,CMS通过扫描的方式与各台RTU设备进行单台通信,这样系统中的CMS与RTU的通信方式就成为点对点的通信方式。整个点对多点系统的通信就成为若干个点对点通信的组合。程序采用C51单片机语言编写,其主控程序流程图如图4、图5所示。

 

2.打包与解包

  协议将主要数据分割成一定格式的数据,并增加一些额外的信息(用于纠错),这个过程叫打包,在接收端协议去掉这些额外信息,只留下初始信息,这个过程叫解包.

下面是一段打包程序:

#define MRTUC _DATAPOLL0xE1 //定义包类型为数据包

#define MRTUC _DATAPOLLRESPONSE    0xE2//定义包类型为应答数据包

#define MRTUC _ACTIVATE 0xF1//定义包类型为请求握手包

#define MRTUC _ACTIVATEREQUEST      0xF2//定义包类型为应答握手包

#define E$HostID  0x11  //定义目标主机地址

void SCI_Putc( unsigned char data ); //通过SCI输出数据函数

void SCI_Puts(unsigned char *str,unsigned char length) //输出多数据函数

{

   while ( length!=0 ){

      SCI_Putc( *str++ );                        //通过SCI发送数据

                     Length--;

}

}

void CheckActiveFunc(unsigned char unit)  //请求握手函数

{

   unsigned char buff[8];

  

   buff[0]=0xFF;                     //引导字节

   buff[1]=0xAA;                    //引导字节

   buff[2]=0x55;                     //引导字节

   buff[3] = MRTUC _ACTIVATE;      //数据包头字节

   buff[4] = 0x03;                    //数据包长度

   buff[5] = E$HostID;                //主机地址

   buff[6] = unit;                     //从机地址

   buff[7] = 1 + ~(MRTUC _ACTIVATE + 0x03 + E$HostID + unit); //校验字节

   SCI_Puts(buff,8);                  //发送数据包

}

 

void ResponseActiveRequestFunc(void)

{

   unsigned char buff[8];

   buff[0]=0xFF;

   buff[1]=0xAA;

   buff[2]=0x55;

   buff[3] = MRTUC _ACTIVATEREQUEST;

   buff[4] = 0x03;

   buff[5] = E$HostID;

   buff[6] = unit;

   buff[7] = 1 + ~(MRTUC _ACTIVATEREQUEST + 0x03 + E$HostID + unit);

   SCI_Puts(buff,8);

}

 

void DataPollFunc(unsigned char unit)

{

   unsigned char buff[8];

   buff[0]=0xFF;

   buff[1]=0xAA;

   buff[2]=0x55;

   buff[3] = MRTUC _DATAPOLL;

   buff[4] = 0x03;

   buff[5] = E$HostID;

   buff[6] = unit;

   buff[7] = 1 + ~(MRTUC _DATAPOLL + 0x03 + E$HostID + unit);

   SCI_Puts(buff,8);

}

 

void ResponseDataPollFunc(unsigned char unit)

{

   unsigned char buff[8];

   buff[0]=0xFF;

   buff[1]=0xAA;

   buff[2]=0x55;

   buff[3] = MRTUC _DATAPOLLRESPONSE;

   buff[4] = 0x3;

   buff[5] = E$HostID;

   buff[6] = unit;

   buff[7] = 1 + ~(MRTUC _DATAPOLLRESPONSE + 0x3 + E$HostID + unit);

   SCI_Puts(buff,8);

}

{{分页}}

程序解包流程图:

    解包子程序流程图如图6所示。

解包程序:

#define TOTAL_RESPONSE    5 //定义数据包的总数

void SCI_Getc(void);                  //从SCI buffer取数据函数

struct ResponseCodeStruct {      //定义数据包结构体

   unsigned char Code;              // 数据包的类型

   unsigned char Length;            // 数据包的长度

};

const ResponseCodeStruct ResponseCodeTable[TOTAL_RESPONSE]={

   { 0, 0 },

   {MRTUC _DATAPOLL,          3},

   {MRTUC _DATAPOLLRESPONSE,   3},

   {MRTUC _ACTIVATE,           3},

   {MRTUC _ACTIVATEREQUEST,    3},

};

unsigned char CheckResponseCode( unsigned char code )//检查数据包类型函数

{

  unsigned char i;

  

  for ( i=1; i<TOTAL_RESPONSE; i++ ) {

     if ( ResponseCodeTable[i].Code == code )

        return i;

  }

  return 0;

}

void ResetReceivingStatus( void )           //复位接收状态

{

   PacketStatus &= ~PC_START;          //数据包为开始状态

   BufferIndex = 0;                      //复位接收头字节标志

}

void SerialHandler( void )             //数据解包子程序

{

   unsigned char char,i,j;

   unsigned char *buff;

   if ((PacketStatus & PC_READY)==0 ) { //检查数据包状态

      if ( SCI_Flags & SCI_IQDIRTY ) {  //检查SCI状态

         char = SCI_Getc();            //从buffer取一字节数据

         if ( BufferIndex==0) {         // 检查是否为头字节

            if ( (CodeIndex=CheckResponseCode( char ))==0   ) {

              CodeIndex=0;      

              ResetReceivingStatus();   //复位接收状态

              }

              return;               //如果不正确返回取下一字节

            }

            CheckSum = 0;

            PacketStatus |= PC_START; //定义开始接收数据

         }

         else if ( BufferIndex==1 ) {          

         if(char<3|| har>(SCI_IQMASK-1)|| (ResponseCodeTable[CodeIndex]. Length && ResponseCodeTable[CodeIndex].Length!=char) ) { //检查长度

               CodeIndex=0;

               ResetReceivingStatus();

               }

               return;

            }

            PacketLength = char + 2;

         }

         else if ( BufferIndex==2 ) {           // 检查主机地址

            if ( char!=E$HostID ) {

               CodeIndex=0;

               ResetReceivingStatus();

                }

                return;

            }

         }

         else if ( BufferIndex==3 ) {           // 检查从机地址

            if ( char>MAX_UNIT || char==0 ) {

               return;

            }

            else {

              if(E$UNIT!=char){

                CodeIndex=0;

                ResetReceivingStatus();

                return;

              }

            }

         }

         PacketBuffer[BufferIndex++] = char;

         if ( BufferIndex>=2 ) {

            if ( BufferIndex==PacketLength ) {

               CheckSum = 1 + ~CheckSum;

               if ( char==CheckSum ) {              //校验

                  PacketStatus |= PC_READY;

               }

               ResetReceivingStatus();

            }

         }

         CheckSum += char;

      }

      else {

         if ( (PacketStatus & PC_START) && TimeOut==0 ) {

            CodeIndex=0;

            ResetReceivingStatus();

         }

      }

   } }

结束语
 
  本文中的无线硬件设计、软件设计解决方案已被多次运用于多种产品、多种系统。目前各种产品、系统运行稳定,无线通信误码率低、可靠性高、安全性好。文中的软硬件设计方案,可适用于各种单片机,对于无线通信技术在我国推广和广泛的运用有着重要的参考价值。

参考文献

1.上海桑博  STR-2无线数据收发模块使用手册    上海桑博电子科技有限公司   2002

2.Nordic     nRF401 Product Specification          Nordic corporation           2000

3. 谭浩强     C程序设计                        清华大学出版社            1999



关键词: 点对多点 无线 通信

评论


相关推荐

技术专区

关闭