1. 程式人生 > >串列埠通訊資料傳送--字元傳送和16進位制傳送--傳送位元組的間隔時間

串列埠通訊資料傳送--字元傳送和16進位制傳送--傳送位元組的間隔時間

在計算機中,所有的資料在儲存和運算時都要使用二進位制數表示(因為計算機用高電平和低電平分別表示1和0),例如,像a、b、c、d這樣的52個字母(包括大寫)、以及0、1等數字還有一些常用的符號(例如*、#、@等)在計算機中儲存時也要使用二進位制數來表示,而具體用哪些二進位制數字表示哪個符號,當然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通訊而不造成混亂,那麼大家就必須使用相同的編碼規則,於是美國有關的標準化組織就出臺了所謂的ASCII編碼,統一規定了上述常用符號用哪些二進位制數來表示.

A在ascii中定義為01000001,也就是十進位制65,有了這個標準後,當我們輸入A時,計算機就可以通過ascii碼知道輸入的字元的二進位制編碼是01000001。而沒有這樣的標準,我們就必須自己想辦法告訴計算機我們輸入了一個A;沒有這樣的標準,我們在別的機器上就需要重新編碼以告訴計算機我們要輸入A。ascii碼指的不是十進位制,是二進位制。只是用十進位制表示習慣一點罷了,比如在ascii碼中,A的二進位制編碼為01000001,如果用十進位制表示是65,用十六進位制表示就是41H

在串列埠除錯助手傳送選項和接收選項處,還有個“字元格式傳送”和“字元格式顯示”,這是什麼意思呢?先拋開我們使用的漢字不談,那麼我們常用的字元就包含了0~9的數字、A~Z/a~z的字母、還有各種標點符號等。那麼在計算機系統裡面我們怎麼來表示它們呢?ASCII(American Standard Code for Information Interchange即美國資訊互換標準程式碼)可以完成這個使命:我們知道,在計算機中一個位元組的資料可以有0255256個值,我們取其中的0127128個值賦予了它另外一層涵義,即讓它們分別來代表一個常用字元,其具體的對應關係如下表11-3 ASCII
ASCII值控制字元ASCII值字元ASCII值字元ASCII值字元
000NUL032(space)064@096
001SOH033!065A097a
002STX034"066B098b
003ETX035#067C099c
004EOT036$068D100d
005END037%069E101e
006ACK038&070F102f
007BEL039'071G103g
008BS040(072H104h
009HT041)073I105i
010LF042*074J106j
011VT043+075K107k
012FF044076L108l
013CR045-077M109m
014SO046078N110n
015SI047/079O111o
016DLE0480080P112p
017DC10491081Q113q
018DC20502082R114r
019DC30513083S115s
020DC40524084T116t
021NAK0535085U117u
022SYN0546086V118v
023ETB0557087W119w
024CAN0568088X120x
025EM0579089Y121y
026SUB058:090Z122z
027ESC059;091[123{
028FS060<092\124|
029GS061=093125}
030RS062>094^126~
031US063?095_127DEL
這樣我們就在常用字元和位元組資料之間建立了一一對應的關係,位元組是資料儲存的最小單位,儲存一個字元是以位元組為單位進行的(也即是8位二進位制),那麼現在一個位元組就既可以代表一個整數又可以代表一個字元了,但它本質上只是一個位元組的資料,而我們賦予了它不同的涵義,什麼時候賦予它哪種涵義就看程式設計者的意圖了。  通過上述可以知道串列埠通訊的本質是傳送對應字元的以二進位制表示的ASCII碼:比如:  用字元格式傳送一個小寫的a,a的ASCII碼是二進位制 0110 0001 ,十六進位制的0x61,十進位制是97,就是通過串列埠把0110 0001按位傳送出去  用字元格式傳送一個數字1,   1的ASCII碼是二進位制 0011 0001 ,十六進位制的0x31,十進位制是49,就是通過串列埠把0011 0001按位傳送出去;      用字元格式傳送  a12b,  a12b的ASCII碼是二進位制 0110 0001 0011 0001 0011 0010 0110 0010,十六進位制 61 31 32 62 ,就是通過串列埠按位傳送出去,而每傳送八位資料(一個位元組)就有一個停止位,然後傳送接下來的一個字元(8位),這樣就依次傳送了字元a-1-2-b 的ASCII碼。     用十六進位制傳送的本質就是傳送對應字元的ASCII碼的十六進位制表示,傳送框裡寫入十六進位制,實際傳送的時候仍然是十六進位制轉換為二進位制,然後按位傳送出去。 

串列埠傳送一幀資料時,兩個位元組的間隔時間是多少?

波特率:傳送二進位制資料位的速率,習慣上用 baud 表示,即我們傳送一位二進位制資料的持續時間=1/baud。

如果波特率為9600,傳送一個位需要的時間為1/9600s=0.0001042s=0.1042ms,這裡按資料位為8位,停止位為2位, 
加起來就是10位,10個位傳送所需的時間為:0.1042*10ms = 1.042ms,如果我要傳送10個位元組的資料,那傳送這10個位元組資料給接收方需要 的時間為:10*1.042ms = 10.42ms,這是算實際的傳送10個位元組的資料所需要的時間。我們在接收方接收資料時可以 
把時間再加寬一些,讓它有一點餘量。讓接收方能穩定的把資料從傳送方接手過來,可以加個5ms,或更寬一點10ms, 
加上傳送10個位元組所花的時間,就是15ms或20ms。