新闻中心

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

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



评论


相关推荐

技术专区

关闭