GSM串列埠多路複用協議
串列埠多路複用(以下簡稱多路複用)是在一條物理序列介面上實現多個數據鏈路連線(DLC),使得可以同時在一條序列介面上存在多個會話,比如語音、FAX、資料、SMS、GPRS、USSD等。幀結構類似HDLC。
多路複用有三種操作模式:基本模式、帶錯誤恢復功能的高階模式、不帶錯誤恢復功能的高階模式(具體可以參見GSM 07.10協議),華為GTM900模組支援不帶錯誤恢復功能的高階模式,與基本模式相比有如下特點:
- 可以在應用XON/XOFF流控的連結上使用
- 失去同步後恢復時間比較快
採用什麼模式對於使用者來說,影響不會很大,根據協議,基本模式與高階模式的處理過程非常類似,根據所提供的參考手冊,使用者很容易從一種模式轉到另一種模式,比如從基本模式轉到高階模式。
多路複用提供如下的業務介面:
- 啟動業務
- DLC建立業務
- 資料業務
- DLC釋放業務
- 關閉業務
上述給出的業務在後面將會給出詳細的介紹和應用舉例。
- 標記:基本模式時為0XF9,高階模式時為0X7E。
- 地址:
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
EA |
C/R |
DLCI |
EA:用於地址擴充套件,現在始終為1。
C/R:命令/響應
Command/response位用法如下:
Command/response |
Direction |
C/R value |
||
Command |
Initiator |
|
Responder |
1 |
Responder |
|
Initiator |
0 |
|
Response |
Initiator |
|
Responder |
0 |
Responder |
|
Initiator |
1 |
DLCI:DLC標識,取值範圍為0~63。
- 控制:定義幀型別
幀型別 |
BIT1 |
BIT2 |
BIT3 |
BIT4 |
BIT5 |
BIT6 |
BIT7 |
BIT8 |
SABM |
1 |
1 |
1 |
1 |
P/F |
1 |
0 |
0 |
UA |
1 |
1 |
0 |
0 |
P/F |
1 |
1 |
0 |
DM |
1 |
1 |
1 |
1 |
P/F |
0 |
0 |
0 |
DISC |
1 |
1 |
0 |
0 |
P/F |
0 |
1 |
0 |
UIH |
1 |
1 |
1 |
1 |
P/F |
1 |
1 |
1 |
UI |
1 |
1 |
0 |
0 |
P/F |
0 |
0 |
0 |
P/F:P/F位是依據該幀是命令幀/響應幀來確定是P功能還是F功能。如果是命令幀,則P/F位作為P功能;如果是響應幀,則P/F位作為F功能。如果一個命令希望應答,命令幀的P功能設定為1,響應幀(對該命令幀的應答)的F功能也應該設定為1。對於命令傳送端來說,傳送一個希望應答的命令後,必須等到對端應答或者超時,才能傳送下一個希望應答的命令。超時可以進行重發或者相應的異常處理。
SABM(Set Asynchronous Balanced Mode):SABM命令幀用於建立一個DLC,接收端收到並且認可該命令後,用UA幀進行應答。如果對端沒有準備好或者不願意建立該DLC,則對端用DM幀進行應答,F位設定為1。如果T1時間內沒有收到UA或者DM響應,發起者會重發DISC,直到重發次數達到設定值。
UA(Unnumbered Acknowledgement):UA響應幀用於接收端對收到並且認可的SABM幀或DISC幀的應答。
DM(Disconnected Mode):DM響應幀用於在連結還沒有建立的狀態下,接收端對接收到的DISC命令幀的響應。在連結還沒有建立的狀態下,接收端對於接收到的命令(除DISC外)不響應。F功能如果為1表示對接收的命令的響應。接收到非請求的DM響應幀時進行的處理,不考慮F位。
DISC(Disconnect):DISC命令幀用於通知對端拆除連結,對端用UA響應幀應答。如果在DLC0傳送DISC命令幀,則等效於退出MUX功能。
- 長度
BIT1 |
BIT2 |
BIT3 |
BIT4 |
BIT5 |
BIT6 |
BIT7 |
BIT8 |
EA |
L1 |
L2 |
L3 |
L4 |
L5 |
L6 |
L7 |
EA用於擴充套件,本文取EA為1,表示長度域只有一個位元組表示。
- 資訊:資訊域由若干位元組組成。資訊幀有 I 幀、UI 幀和UIH幀,GTM900模組支援UIH幀。
- 校驗:
校驗域只包括1個位元組,生成多項式為:x8 + x2 + x + 1。
對於UIH幀,FCS的計算只包括地址和控制域。
對於命令/響應幀,FCS的計算包括地址、控制和長度。(高階模式沒有長度域)
注:具體演算法請參見GSM協議07.10。
注:關於C/R及P/F位,補充幾點:
- F功能如果為1表示對接收的命令的響應,F功能為0表示主動報告狀態。
- 傳輸資料資訊(比如“ATD1861;”)時,在PC-》GTM900方向(見後面應用舉例部分),C/R位置為1;在GTM900-》PC方向,C/R位置為0;兩個方向P位都位0。
基本模式的幀結構如下:
標記 |
地址 |
控制 |
長度 |
資訊 |
校驗 |
標記 |
1位元組 |
1位元組 |
1位元組 |
1或2位元組 |
整數個位元組 |
1位元組 |
1位元組 |
圖 X: 基本模式的幀結構
高階模式的幀結構如下:
標記 |
地址 |
控制 |
資訊 |
校驗 |
標記 |
1位元組 |
1位元組 |
1位元組 |
整數個位元組 |
1位元組 |
1位元組 |
圖 X: 高階模式的幀結構
注:沒有長度域。
當中CRC8計算:
一、陣列方式
const unsigned char crctable[256] = { //reversed, 8-bit, poly=0x07
0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69, 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D, 0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51, 0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,
0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05, 0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19, 0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D, 0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21, 0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,
0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95, 0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89, 0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD, 0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1, 0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,
0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5, 0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9, 0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD, 0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1, 0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF
};
uint8_t transmitter_crc8_calculate(uint8_t *pchBuffer,uint16_t hwSize)
{
/*Init*/
unsigned char FCS=0xFF;
if(NULL == pchBuffer || !hwSize){
return 0;
}
/*len is the number of bytes in the message, p points to message*/
while (hwSize--) {
FCS=crctable[FCS^*pchBuffer++];
}
/*Ones complement*/
FCS=0xFF-FCS;
return FCS;
}
bool receiver_crc8_calculate(uint8_t *pchBuffer,uint16_t hwSize,uint8_t chFCS)
{
/*Init*/
unsigned char FCS=0xFF;
if(NULL == pchBuffer || !hwSize){
return false;
}
/*len is the number of bytes in the message, p points to message*/
while (hwSize--) {
FCS=crctable[FCS^*pchBuffer++];
}
/*Ones complement*/
FCS=crctable[FCS^chFCS];
/*0xCF is the reversed order of 11110011.*/
return (0xCF == FCS);
// if (FCS==0xCF) {
// /*FCS is OK*/
// return true;
// }
// else {
// /*FCS is not OK*/
// return false;
// }
}
二、計算方式
unsigned char crc8(unsigned char *ptr, unsigned char len)
{
unsigned char i;
unsigned char crc=0xFF;
while(len--)
{
for(i=1; i!=0; i*=2)
{
if((crc&1)!=0)
{
crc >>= 1;
crc ^= 0xE0;
}
else
{
crc >>= 1;
}
if((*ptr&i)!=0) crc ^= 0xE0;
}
ptr++;
}
return(0xFF - crc);
}