點(diǎn)對多點(diǎn)多任務(wù)無(wú)線(xiàn)通信
現代世界是一個(gè)高速自動(dòng)化的世界,各種各樣的設備除了可以與計算機聯(lián)機外,還可以互相聯(lián)機,而最簡(jiǎn)單的自動(dòng)化聯(lián)機方式就是使用串行通訊。隨著(zhù)時(shí)代的進(jìn)步,它并沒(méi)有被取代,反倒是逐漸被廣泛應用。如今,在許多的場(chǎng)合有線(xiàn)連接的方式已經(jīng)不能滿(mǎn)足科技的高速發(fā)展。無(wú)線(xiàn)技術(shù)正以一種快速的速度進(jìn)入許多產(chǎn)品,它與有線(xiàn)相比主要有成本低,攜帶方便,省去有線(xiàn)布線(xiàn)的煩惱。特別適用于手持設備的通信、電池供電設備、遙控、遙測、小型無(wú)線(xiàn)網(wǎng)絡(luò )、無(wú)線(xiàn)抄表、門(mén)禁系統、小區傳呼、工業(yè)數據采集系統、無(wú)線(xiàn)標簽身份識別、非接觸RF 智能卡、小型無(wú)線(xiàn)數據終端、安全防火系統、無(wú)線(xiàn)遙控系統、生物信號采集、水文氣象監控、機器人控制、無(wú)線(xiàn)232 數據通信、無(wú)線(xiàn)485/422 數據通信、無(wú)線(xiàn)數字語(yǔ)音、數字圖像傳輸、智能小區不停車(chē)收費、銀行智能回單系統等。在如此多的無(wú)線(xiàn)系統應用中,無(wú)線(xiàn)通信的協(xié)議自然顯得特別重要,無(wú)線(xiàn)通信協(xié)議的好壞直接關(guān)系到系統的安全性、誤碼率、以及系統運行的速度。本文以上海桑博科技有限公司的STR-2無(wú)線(xiàn)收發(fā)模塊為例,詳細介紹無(wú)線(xiàn)收發(fā)模塊與各種單片機的硬件接口設計,點(diǎn)對多點(diǎn)無(wú)線(xiàn)通信協(xié)議的數據打包格式、解包程序以及相關(guān)軟件設計。
系統概述
一.連狀點(diǎn)對多點(diǎn)系統
如圖1系統由一臺中央監控設備CMS (Central Monitoring System)和多臺遠程終端設備MRTU(Multiple Remote Termial Unit)構成點(diǎn)對多點(diǎn)多任務(wù)無(wú)線(xiàn)通信系統。在中央監控設備CMS 與 遠程終端RTU(Remote Termial Unit)之間用多臺中轉設備Tran作為中轉站,以便起到暫存數據和延伸距離的作用。中轉站之間,以單向通信方式進(jìn)行傳遞數據。
1.適用范圍
a.適用于傳輸距離遠的多點(diǎn)多任務(wù)數據采集
b.適用于條件惡劣干擾大多點(diǎn)多任務(wù)數據采集
c.適用于對時(shí)間要求不高的各種復雜無(wú)線(xiàn)數傳
d.適用于智能小區水、電、煤、暖氣集中抄表系統,各種遠程集中安防報警系統等。
2.協(xié)議數據包格式
協(xié)議的笫一件事就是能夠識別噪聲和有效數椐,噪聲是以隨機字節出現的,沒(méi)有明顯的結合方式,噪聲源可能產(chǎn)生任意字節的組合,在無(wú)線(xiàn)通信的過(guò)程中最好能通過(guò)一種協(xié)議能有效的抑制噪聲的產(chǎn)生
通過(guò)測試和試驗,發(fā)現0xFF 后跟0XAA,0x55 在噪聲中不容易發(fā)生,傳輸協(xié)議應該在數據包前加開(kāi)始字節0xFF 后跟0xAA,0x55發(fā)送協(xié)議的開(kāi)始應該以一個(gè)任意內容的字節(這是因為第一個(gè)字節的數椐在發(fā)送時(shí)容易丟失),然后是0xFF 后跟一個(gè)0xAA,0x55;接收協(xié)議規定只接收以0xFF 后跟0xAA,0x55 開(kāi)始的包.于是就可以很方便的把以上系統的數據包格式定為:
Lead1 |
Lead2 |
Lead2 |
Header |
Length |
HostID |
Local |
Destination |
unit |
Data1 |
Data2 |
●●● |
Datan |
Checksum |
|
|
Lead 為引導字節
Leader1=0xFF;
Leader2=0xAA;
Leader2=0x55;
Header 為數據包的命令字節,由此確定數據包的類(lèi)型
Length 為數據包包含的Length字節之后的所有字節的長(cháng)度
HostID 為主機地址
Local 為本地機地址
Destination 目標地址
Unit 為RTU地址字節
Data 位數據包字節
Checksum 校驗字節
二. 星狀點(diǎn)對多點(diǎn)通信
如圖 2系統由一臺中央監控設備CMS和多臺遠程終端設備MRTU構成點(diǎn)對多點(diǎn)多任務(wù)無(wú)線(xiàn)通信系統。在中央監控設備CMS 與 每一臺遠程終端RTU(Remote Termial Unit)都以雙向通信方式進(jìn)行傳遞數據。特別適用于數據量大,對時(shí)間要求較高的場(chǎng)合。
1. 適用范圍
a. 適用于傳輸距離較近的地方
a.適用于條件惡劣干擾大的地方
b.適用于對時(shí)間要求高、數據量大的場(chǎng)合
c.適用于智能小區水、電、煤、暖氣集中抄表系統,各種遠程集中安防報警系統等
d.適用于智能家用集中控制系統
e.工業(yè)測控、工業(yè)數據采集
f. 醫療器械、健身器材
g.數據倉庫、智能商場(chǎng)超市導購
h.餐飲無(wú)線(xiàn)點(diǎn)菜系統
i.PDA無(wú)線(xiàn)數傳
j.水紋氣象監控
k.生物信號采集
l.油田環(huán)境監控
m.銀行智能回單系統等
2.協(xié)議數據包格式
根據圖 2可以把系統的數據包格式定為:
Lead1 |
Lead2 |
Lead2 |
Header |
Length |
Unit |
Data1 |
Data2 |
●●● |
Datan |
Checksum |
|
Lead 為引導字節
Leader1=0xFF;
Leader2=0xAA;
Leader2=0x55;
Header 為數據包的命令字節,由此確定數據包的類(lèi)型
Length 為數據包包含的Length字節之后的所有字節的長(cháng)度
Unit 為RTU地址字節
Data 位數據包字節
Checksum 校驗字節
硬件設計
上海桑博電子科技有限公司STR-2 RF Module 的核心部分為nRF401,外加精心設計的內置天線(xiàn),體積為37mm x 47mm,具有體積小,功耗低的特點(diǎn),傳輸距離為200米,傳輸最大速率為20kbit/s,外圍接口電路簡(jiǎn)單,可直接與單片機的通用串行總線(xiàn)(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正常工作狀態(tài),PWR=0低功耗狀態(tài)
TXN:發(fā)射接收控制,TXN=1時(shí)模塊為發(fā)射狀態(tài),TXN=0時(shí)模塊為接收狀態(tài)
STR-2 RF Module 接口簡(jiǎn)單,本文將不作詳細的敘述,如果想要詳細的了解STR-2 RF Module, 請參照參考文獻 1。
{{分頁(yè)}}
軟件設計
在系統中所有STR-2 RF Module 均采用433.92MHZ作為系統工作頻率。下面以星狀點(diǎn)對多點(diǎn)通信系統為例,詳細介紹系統的軟件設計。
1.主程序設計
為了避免同頻干擾的問(wèn)題,系統采用分時(shí)TDMA(Time Division Multiple Access)技術(shù),把系統CMS與任意一臺RTU之間的通信采用時(shí)分的方式分開(kāi),CMS通過(guò)掃描的方式與各臺RTU設備進(jìn)行單臺通信,這樣系統中的CMS與RTU的通信方式就成為點(diǎn)對點(diǎn)的通信方式。整個(gè)點(diǎn)對多點(diǎn)系統的通信就成為若干個(gè)點(diǎn)對點(diǎn)通信的組合。程序采用C51單片機語(yǔ)言編寫(xiě),其主控程序流程圖如圖4、圖5所示。
2.打包與解包
協(xié)議將主要數據分割成一定格式的數據,并增加一些額外的信息(用于糾錯),這個(gè)過(guò)程叫打包,在接收端協(xié)議去掉這些額外信息,只留下初始信息,這個(gè)過(guò)程叫解包.
下面是一段打包程序:
#define MRTUC _DATAPOLL0xE1 //定義包類(lèi)型為數據包
#define MRTUC _DATAPOLLRESPONSE 0xE2//定義包類(lèi)型為應答數據包
#define MRTUC _ACTIVATE 0xF1//定義包類(lèi)型為請求握手包
#define MRTUC _ACTIVATEREQUEST 0xF2//定義包類(lèi)型為應答握手包
#define E$HostID 0x11 //定義目標主機地址
void SCI_Putc( unsigned char data ); //通過(guò)SCI輸出數據函數
void SCI_Puts(unsigned char *str,unsigned char length) //輸出多數據函數
{
while ( length!=0 ){
SCI_Putc( *str++ ); //通過(guò)SCI發(fā)送數據
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; //數據包長(cháng)度
buff[5] = E$HostID; //主機地址
buff[6] = unit; //從機地址
buff[7] = 1 + ~(MRTUC _ACTIVATE + 0x03 + E$HostID + unit); //校驗字節
SCI_Puts(buff,8); //發(fā)送數據包
}
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);
}
{{分頁(yè)}}
程序解包流程圖:
解包子程序流程圖如圖6所示。
解包程序:
#define TOTAL_RESPONSE 5 //定義數據包的總數
void SCI_Getc(void); //從SCI buffer取數據函數
struct ResponseCodeStruct { //定義數據包結構體
unsigned char Code; // 數據包的類(lèi)型
unsigned char Length; // 數據包的長(cháng)度
};
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 )//檢查數據包類(lèi)型函數
{
unsigned char i;
for ( i=1; i<TOTAL_RESPONSE; i++ ) {
if ( ResponseCodeTable[i].Code == code )
return i;
}
return 0;
}
void ResetReceivingStatus( void ) //復位接收狀態(tài)
{
PacketStatus &= ~PC_START; //數據包為開(kāi)始狀態(tài)
BufferIndex = 0; //復位接收頭字節標志
}
void SerialHandler( void ) //數據解包子程序
{
unsigned char char,i,j;
unsigned char *buff;
if ((PacketStatus & PC_READY)==0 ) { //檢查數據包狀態(tài)
if ( SCI_Flags & SCI_IQDIRTY ) { //檢查SCI狀態(tài)
char = SCI_Getc(); //從buffer取一字節數據
if ( BufferIndex==0) { // 檢查是否為頭字節
if ( (CodeIndex=CheckResponseCode( char ))==0 ) {
CodeIndex=0;
ResetReceivingStatus(); //復位接收狀態(tài)
}
return; //如果不正確返回取下一字節
}
CheckSum = 0;
PacketStatus |= PC_START; //定義開(kāi)始接收數據
}
else if ( BufferIndex==1 ) {
if(char<3|| har>(SCI_IQMASK-1)|| (ResponseCodeTable[CodeIndex]. Length && ResponseCodeTable[CodeIndex].Length!=char) ) { //檢查長(cháng)度
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();
}
}
} }
結束語(yǔ)
本文中的無(wú)線(xiàn)硬件設計、軟件設計解決方案已被多次運用于多種產(chǎn)品、多種系統。目前各種產(chǎn)品、系統運行穩定,無(wú)線(xiàn)通信誤碼率低、可靠性高、安全性好。文中的軟硬件設計方案,可適用于各種單片機,對于無(wú)線(xiàn)通信技術(shù)在我國推廣和廣泛的運用有著(zhù)重要的參考價(jià)值。
參考文獻
1.上海桑博 STR-2無(wú)線(xiàn)數據收發(fā)模塊使用手冊 上海桑博電子科技有限公司 2002
2.Nordic nRF401 Product Specification Nordic corporation 2000
3. 譚浩強 C程序設計 清華大學(xué)出版社 1999
評論