針對串口通信,關(guān)于設(shè)置數(shù)據(jù)位長度對通信的影響,如圖:
在串口數(shù)據(jù)通信中,會看到串口參數(shù)設(shè)置。其中“數(shù)據(jù)位”設(shè)置,共有四檔選項,分別是8、7、6、5。那么改變這個參數(shù)會對數(shù)據(jù)的傳輸有什么影響呢?
我來做個試驗,通過示波器觀察通信過程,能夠分析結(jié)果如下:
例如數(shù)據(jù)位設(shè)置為5。那么就相當(dāng)于規(guī)定了每個傳輸字節(jié)只能由5個二進(jìn)制位來表示,例如:11111,10110,01110等。也就是說,這個RS232口只能發(fā)送00000~11111這個范圍內(nèi)的數(shù),如果發(fā)送一個比11111還大的數(shù),例如11111+1,也就是100000,那么經(jīng)過這個RS232口的處理以后,只會發(fā)送出去一個00000,而接收端只能接收到00000。這樣看起來貌似發(fā)送的數(shù)據(jù)和接收的不一樣,其實這是串口數(shù)據(jù)位長度決定了他會發(fā)送多少位數(shù)據(jù),超出的位是不會被發(fā)送的。
通過示波器觀察,我們就能清楚的看到,如果設(shè)備是正常的情況下,且串口發(fā)送端和接收端都設(shè)置數(shù)據(jù)位為5位,發(fā)送下面這些十六進(jìn)制數(shù),會顯示出如下波形:
分別在串口調(diào)試軟件的發(fā)送窗口輸入上面的這四個十六進(jìn)制數(shù),就能通過示波器看到這些數(shù)字所對應(yīng)的二進(jìn)制碼波形。數(shù)據(jù)位設(shè)置是5位,要從右往左查看波形,因為串口通信是先傳輸?shù)臀?,后傳輸高位,所以要反過來讀取二進(jìn)制位。
通過上面的觀察,我們可以確定,如果數(shù)據(jù)位設(shè)置是5位,那么我們可以發(fā)送的最大數(shù)字是0x1F,也就是二進(jìn)制數(shù)11111B。超過0x1F的數(shù)就保留低五位,所構(gòu)成的二進(jìn)制數(shù),就是能夠被接收到的數(shù);如果我們設(shè)置數(shù)據(jù)位是6位,那么我們可以發(fā)送的最大數(shù)字就是0x3F。超過0x3F的數(shù)就就保留低六位,所構(gòu)成的二進(jìn)制數(shù),就是能夠被接收到的數(shù)據(jù)。
另外,我們知道,一個ASCII碼必須要用8位二進(jìn)制數(shù)來表示,其中低7位表示字符,同時還要注意,在標(biāo)準(zhǔn)ASCII中,最高位(b7)用作奇偶校驗位。這也就意味著如果串口傳輸?shù)臄?shù)據(jù)位設(shè)置是5或者6位,那么這種情況下,串口是無法發(fā)送出ASCII碼表中數(shù)值大于11111B(十進(jìn)制31)或者111111B(十進(jìn)制63)的數(shù)所表示ASCII字符的。
比如我們設(shè)置串口數(shù)據(jù)位是5位,我們發(fā)送一個字母a,我們知道在字母a在ASCII碼中的十進(jìn)制數(shù)是97,二進(jìn)制是1100001B,大于11111B。則此時只能傳輸出去后五位,也就是00001B,而接收端只會顯示出十六進(jìn)制數(shù)01,而不能顯示出一個完整的字母a。只有數(shù)據(jù)為設(shè)置是7位和7位以上時,才能傳輸一個完整的ASCII字符。