所謂通信協議是指通信雙方的一種約定。約定包括對數據格式、同步方式、傳送速度、傳送步驟、檢糾錯方式以及控制字符定義等問題做出統一規定,通信雙方必須共同遵守。因此,也叫做通信控制規程,或稱傳輸控制規程,它屬于ISO‘S OSI七層參考模型中的數據鏈路層。目前,采用的通信協議有兩類:異步協議和同步協議。同步協議又有面向字符和面向比特以及面向字節計數三種。其中,面向字節計數的同步協議主要用于DEC公司的網絡體系結構中。
一、物理接口標準
1.串行通信接口的基本任務
(1)實現數據格式化:因為來自CPU的是普通的并行數據,所以,接口電路應具有實現不同串行通信方式下的數據格式化的任務。在異步通信方式下,接口自動生成起止式的幀數據格式。在面向字符的同步方式下,接口要在待傳送的數據塊前加上同步字符。
(2)進行串-并轉換:串行傳送,數據是一位一位串行傳送的,而計算機處理數據是并行數據。所以當數據由計算機送至數據發送器時,首先把串行數據轉換為并行數才能送入計算機處理。因此串并轉換是串行接口電路的重要任務。
(3)控制數據傳輸速率:串行通信接口電路應具有對數據傳輸速率——波特率進行選擇和控制的能力。
(4)進行錯誤檢測:在發送時接口電路對傳送的字符數據自動生成奇偶校驗位或其他校驗碼。在接收時,接口電路檢查字符的奇偶校驗或其他校驗碼,確定是否發生傳送錯誤。
(5)進行TTL 與EIA電平轉換:CPU 和終端均采用TTL電平及正邏輯,它們與EIA采用的電平及負邏輯不兼容,需在接口電路中進行轉換。
(6)提供EIA-RS-232C 接口標準所要求的信號線:遠距離通信采用MODEM 時,需要9根信號線;近距離零MODEM 方式,只需要3 根信號線。這些信號線由接口電路提供,以便與MODEM 或終端進行聯絡與控制。
2、串行通信接口電路的組成
為了完成上述串行接口的任務,串行通信接口電路一般由可編程的串行接口芯片、波特率發生器、EIA 與TTL 電平轉換器以及地址譯碼電路組成。其中,串行接口芯片,隨著大規模繼承電路技術的發展,通用的同步(USRT)和異步(UART)接口芯片種類越來越多,如下表所示。
它們的基本功能是類似的,都能實現上面提出的串行通信接口基本任務的大部分工作,且都是可編程的。才用這些芯片作為串行通信接口電路的核心芯片,會使電路結構比較簡單。
3.有關串行通信的物理標準
為使計算機、電話以及其他通信設備互相溝通,現在,已經對串行通信建立了幾個一致的概念和標準,這些概念和標準屬于三個方面:傳輸率,電特性,信號名稱和接口標準。
1、傳輸率:所謂傳輸率就是指每秒傳輸多少位,傳輸率也常叫波特率。國際上規定了一個標準波特率系列,標準波特率也是最常用的波特率,標準波特率系列為110、300、600、1200、4800、9600 和19200。大多數CRT 終端都能夠按110 到9600范圍中的任何一種波特率工作。打印機由于機械速度比較慢而使傳輸波特率受到限制,所以,一般的串行打印機工作在110 波特率,點針式打印機由于其內部有較大的行緩沖區,所以可以按高達2400波特的速度接收打印信息。大多數接口的接收波特率和發送波特率可以分別設置,而且,可以通過編程來指定。
2、RS-232-C標準:RS-232-C 標準對兩個方面作了規定,即信號電平標準和控制信號線的定義。RS-232-C 采用負邏輯規定邏輯電平,信號電平與通常的TTL電平也不兼容,RS-232-C 將-5V~-15V 規定為“1”,+5V~+15V規定為“0”。圖1是TTL 標準和RS-232-C標準之間的電平轉換。
二、軟件協議
1.OSI協議和TCP/IP協議
(1)OSI 協議
OSI 七層參考模型不是通訊標準,它只給出一個不會由于技術發展而必須修改的穩定模型,使有關標準和協議能在模型定義的范圍內開發和相互配合。一般的通訊協議只符合OSI 七層模型的某幾層,如: EIA-RS-232-C:實現了物理層。IBM 的SDLC(同步數據鏈路控制規程):數據鏈路層。ANSI 的ADCCP(先進數據通訊規程):數據鏈路層IBM 的BSC(二進制同步通訊協議):數據鏈路層。應用層的電子郵件協議SMTP只負責寄信、POP3 只負責收信。 (2)TCP/IP協議 實現了五層協議。
(1)物理層:對應OSI 的物理層。
(2)網絡接口層:類似于OSI的數據鏈路層。
(3)Internet 層:OSI 模型在Internet 網使用前提出,未考慮網間連接。
(4)傳輸層:對應OSI 的傳輸層。
(5)應用層:對應OSI 的表示層和應用層。
2.串行通信協議
串行通信協議分同步協議和異步協議。
(1)異步通信協議的實例——起止式異步協議
特點與格式:
起止式異步協議的特點是一個字符一個字符傳輸,并且傳送一個字符總是以起始位開始,以停止位結束,字符之間沒有固定的時間間隔要求。其格式如圖3 所示。每一個字符的前面都有一位起始位(低電平,邏輯值0),字符本身有5~7 位數據位組成,接著字符后面是一位校驗位(也可以沒有校驗位),最后是一位,或意味半,或二位停止位,停止位后面是不定長度的空閑位。停止位和空閑位都規定為高電平(邏輯值),這樣就保證起始位開始處一定有一個下跳沿。
從圖中可以看出,這種格式是靠起始位和停止位來實現字符的界定或同步的,故稱為起始式協議。傳送時,數據的低位在前,高位在后,圖4 表示了傳送一個字符E 的ASCAII碼的波形1010001。當把它的最低有效位寫到右邊時,就是E 的ASCII碼1000101=45H。
起/止位的作用:起始位實際上是作為聯絡信號附加進來的,當它變為低電平時,告訴收方傳送開始。它的到來,表示下面接著是數據位來了,要準備接收。而停止位標志一個字符的結束,它的出現,表示一個字符傳送完畢。這樣就為通信雙方提供了何時開始收發,何時結束的標志。傳送開始前,發收雙方把所采用的起止式格式(包括字符的數據位長度,停止位位數,有無校驗位以及是奇校驗還是偶校驗等)和數據傳輸速率作統一規定。傳送開始后,接收設備不斷地檢測傳輸線,看是否有起始位到來。當收到一系列的“1”(停止位或空閑位)之后,檢測到一個下跳沿,說明起始位出現,起始位經確認后,就開始接收所規定的數據位和奇偶校驗位以及停止位。
經過處理將停止位去掉,把數據位拼裝成一個并行字節,并且經校驗后,無奇偶錯才算正確的接收一個字符。一個字符接收完畢,接收設備有繼續測試傳輸線,監視“0”電平的到來和下一個字符的開始,直到全部數據傳送完畢。 由上述工作過程可看到,異步通信是按字符傳輸的,每傳輸一個字符,就用起始位來通知收方,以此來重新核對收發雙方同步。若接收設備和發送設備兩者的時鐘頻率略有偏差,這也不會因偏差的累積而導致錯位,加之字符之間的空閑位也為這種偏差提供一種緩沖,所以異步串行通信的可靠性高。但由于要在每個字符的前后加上起始位和停止位這樣一些附加位,使得傳輸效率變低了,只有約80%。
因此,起止協議一般用在數據速率較慢的場合(小于19.2kbit/s)。在高速傳送時,一般要采用同步協議。
(2)面向字符的同步協議
特點與格式:這種協議的典型代表是IBM公司的二進制同步通信協議(BSC)。它的特點是一次傳送由若干個字符組成的數據塊,而不是只傳送一個字符,并規定了10 個字符作為這個數據塊的開頭與結束標志以及整個傳輸過程的控制信息,它們也叫做通信控制字。由于被傳送的數據塊是由字符組成,故被稱作面向字符的協議。特定字符(控制字符)的定義:由上面的格式可以看出,數據塊的前后都加了幾個特定字符。
SYN是同步字符(synchronous Character),每一幀開始處都有SYN,加一個SYN的稱單同步,加兩個SYN的稱雙同步設置同步字符是起聯絡作用,傳送數據時,接收端不斷檢測,一旦出現同步字符,就知道是一幀開始了。接著的SOH 是序始字符(Start Of Header),它表示標題的開始。標題中包括院地址、目的地址和路由指示等信息。STX是文始字符(StartOfText),它標志著傳送的正文(數據塊)開始。
數據塊就是被傳送的正文內容,由多個字符組成。數據塊后面是組終字符ETB(End Of Transmission Block)或文終字符ETX(EndOf Text),其中ETB用在正文很長、需要分成若干個分數據塊、分別在不同幀中發送的場合,這時在每個分數據塊后面用文終字符ETX。一幀的最后是校驗碼,它對從SOH 開始到ETX(或ETB)字段進行校驗,校驗方式可以是縱橫奇偶校驗或CRC。另外,在面向字符協議中還采用了一些其他通信控制字,它們的名稱如下表所示:
數據透明的實現:面向字符的同步協議,不象異步起止協議那樣,需要在每個字符前后附加起始和停止位,因此,傳輸效率提高了。同時,由于采用了一些傳輸控制字,故增強了通信控制能力和校驗功能。但也存在一些問題,例如,如何區別數據字符代碼和特定字符代碼的問題,因為在數據塊中完全有可能出現與特定字符代碼相同的數據字符,這就會發生誤解。
比如正文有個與文終字符ETX 的代碼相同的數據字符,接收端就不會把它當作為普通數據處理,而誤認為是正文結束,因而產生差錯。因此,協議應具有將特定字符作為普通數據處理的能力,這種能力叫做“數據透明”。為此,協議中設置了轉移字符DLE(Data LinkEscape)。
當把一個特定字符看成數據時,在它前面要加一個DLE,這樣接收器收到一個DLE就可預知下一個字符是數據字符,而不會把它當作控制字符來處理了。DLE 本身也是特定字符,當它出現在數據塊中時,也要在它前面加上另一個DLE。這種方法叫字符填充。字符填充實現起來相當麻煩,且依賴于字符的編碼。正是由于以上的缺點,故又產生了新的面向比特的同步協議。
(3)面向比特的同步協議
特點與格式:面向比特的協議中最具有代表性的是IBM的同步數據鏈路控制規程SDLC(Synchronous Data Link Control),國際標準化組織ISO(International StandardOrganization)的高級數據鏈路控制規程HDLC(High Level Data link Control),美國國家標準協會(Americal National Standard Institute)的先進數據通信規程ADCCP(AdvancedData Communication Control Procedure)。這些協議的特點是所傳輸的一幀數據可以是任意位,而且它是靠約定的位組合模式,而不是靠特定字符來標志幀的開始和結束,故稱“面向比特”的協議。這中協議的一般幀格式如圖5所示:
幀信息的分段:由圖5 可見,SDLC/HDLC的一幀信息包括以下幾個場(Filed),所有場都是從有效位開始傳送。
(1)SDLC/HDLC 標志字符:SDLC/HDLC協議規定,所有信息傳輸必須以一個標志字符開始,且以同一個字符結束。這個標志字符是 01111110,稱標志場(F)。從開始標志到結束標志之間構成一個完整的信息單位,稱為一幀(Frame)。所有的信息是以幀的形傳輸的,而標志字符提供了每一幀的邊界。接收端可以通過搜索“01111110”來探知幀的開頭和結束,以此建立幀同步。
(2)地址場和控制場:在標志場之后,可以有一個地址場A(Address)和一個控制場C(Control)。地址場用來規定與之通信的次站的地址。控制場可規定若干個命令。SDLC規定A 場和C場的寬度為8 位或16 位。接收方必須檢查每個地址字節的第一位,如果為“0”,則后面跟著另一個地址字節;若為“1”,則該字節就是最后一個地址字節。同理,如果控制場第一個字節的第一位為為“0”,則還有第二個控制場字節,否則就只有一個字節。
(3)信息場:跟在控制場之后的是信息場I(Information)。I 場包含有要傳送的數據,并不是每一幀都必須有信息場。即數據場可以為0,當它為0 時,則這一幀主要是控制命令。
(4)幀校驗信息:緊跟在信息場之后的是兩字節的爭校驗,幀校驗場稱為FC(FrameCheck)場或稱為幀校驗序列FCS(Frame check Squence)。SDLC/HDLC 均采用16 位循環冗余校驗碼CRC(Cyclic Redundancy Code)。除了標志場和自動插入的“0”以外,所有的信息都參加CRC計算。 實際應用時的兩個技術問題:
(1)“0”位插入/刪除:如上所述,SDLC/HDLC協議規定以01111110為標志字節,但在信息場中也完全有可能有同一種模式的字符,為了把它與標志區分開來,所以采取了“0”位插入和刪除技術。具體作法是發送端在發送所有信息(除標志字節外)時,只要遇到連續5 個“1”,就自動插入一個“0”,當接收端在接收數據時(除標志字節)如果連續收到5個“1”,就自動將其后的一個“0”刪除是,以恢復信息的原有形式。這種“0”位的插入和刪除過程是由硬件自動完成的。
(2)SDLC/HDLC異常結束:若在發送過程中出現錯誤,則SDLC/HDLC協議常用異常結束(Abort)字符,或稱為失效序列使本幀作廢。在HDLC規程中,7 個連續的“1”被作為失效字符,而在SDLC 中失效字符是8 個連續的“1”。當然在試銷序列中不使用“0”位插入/刪除技術。LC/HDLC 協議規定,在
一幀之內不允許出現數據間隔。在兩幀之間,發送器可以連續輸出標志字符序列,也可以輸出連續的高電平,它被稱為空閑(Idle)信號。
數據幀格式和通訊協議最大的區別是:數據幀格式屬于數據鏈路層協議;通訊協議屬于應用層協議。按ISO/OSI模型觀點,串口進行通信過程至少涉及三個層次的協議:物理層協議、數據路層協議和應用層協議。
(1)物理層協議:規定串口硬件的通信方式。以異步串行通信為例,物理層協議包括串行接口的的波特率、數據位位數、停止位位數以及奇偶校驗方式。
(2)數據鏈路層協議:規定數據幀格式,包括數據幀的起始定義、幀的字節數、幀結束定義。有時,數據幀格式中還包括垂直校驗和,如CRC校驗和等。
(3)應用層協議:也稱為通信協議,規定雙方在通信過程中的交互方式,誰先發起通信,是否對方需要應答、是否需要出錯重發等。
RS232通信協議源代碼
int OpenComm(char * commstr,char * boundstr)
{
struct termio t;
char filename[20];
int comid;
#ifndef SCOUNIX_SYS
sprintf(filename, “/dev/tty%s”, commstr);
#else
sprintf(filename, “/dev/tty%da”, (*commstr) - ‘a’ + 1);
#endif
comid=(int)(tolower(*commstr)-‘a’);
if(comid《0||comid》;10)
{
printf(“system unable to open %s!\n”, filename);
return 0;
}
if((INFO.CommFd[comid] = open(filename, O_RDWR )) 《 0)
{
printf(“system unable to open %s!\n”, filename);
return 0;
};
if(ioctl(INFO.CommFd[comid], TCGETA, &t) 《 0)
{
printf(“system unable to open %s!\n”, filename);
return 0;
};
if(fcntl(INFO.CommFd[comid],F_SETFL,O_NDELAY)《0)
{
printf(“system unable to open %s!\n”, filename);
return 0;
};
t.c_cflag = CLOCAL | PARENB | CS7 | CREAD |ChkBound(boundstr);
t.c_iflag = IGNCR |BRKINT | IGNPAR | IXON | IXANY | IXOFF;
t.c_oflag = OPOST ;
t.c_lflag = 0;
t.c_line = 0;
t.c_cc[4] = 1;
if(ioctl(INFO.CommFd[comid], TCSETA, &t) 《 0)
{
printf(“system unable to open %s!\n”, filename);
close(INFO.CommFd[comid]);
return 0;
}
printf(“system open %s: handle: %d successfully!\n”, filename,INFO.CommFd[comid]);
return 1;
}
評論
查看更多