串口MSComm控件五种不同校验方式对数据收发的影响
串口MSComm控件有五種校驗方式,分別是無校驗(None),奇校驗(Odd),偶校驗(Even),1校驗(Mark),0校驗(Space)。
在RS232/RS485/RS422通訊中,通過串口發送一字節(8BIT)數據時,首先發送起始位(固定為0),然后發送8位數據(先低位后高位),如果校驗方式不是無校驗(None),則緊接著會發送一位校驗位,最后發送停止位。停止位固定為1。
停止位依據串口屬性的設置可為1位,1.5位或2位。為了說明簡潔起見,下面均假設停止位位數為1而數據位位數為8。
在數據發送時,如果校驗方式設置為無校驗(None),則不發送校驗位;否則會發送一位校驗位。
具體地,如果校驗方式設置為1校驗(Mark),校驗位固定為1;如果校驗方式設置為0校驗(Space),校驗位固定為0;如果校驗位為奇校驗(Odd),或者偶校驗(Even),那么校驗位可能為0也可能為1,依據所發送的數據計算得出。計算方法:如果是奇校驗,那么8位數據和1位校驗位的累加和必是奇數;對應的,如果是偶校驗,8位數據和1位校驗位的累加和必為偶數。比如,數據37,其二進制編碼為00100101,編碼中含有5個0和3個1,5*0+3*1=3,如果采用奇校驗,那么校驗位為0;如果使用偶校驗,校驗位則為1。
使用MSComm控件發送數據時,校驗位無需用戶干預,數據發送時自動地由操作系統計算、添加、發出。
?
串口MSComm控件在接收數據時,如果無校驗,則只要檢測到串口出現了數據,數據總能收到(試驗發現,即使停止位為0也不會被認為是錯誤幀而遭遇拋棄);而采用了某種校驗后,只有校驗通碼正確的數據才能被正確地收到。
試驗中發現,發生校驗錯的那些數據在后面能校驗通過的數據被收到時才被輸出,輸出值一律為5BH。
為什么是5BH(‘[’)呢?不明白,納悶中…
?
下面是試驗過程中的截圖:?
第一組試驗:發送方發送的1個數據楨有10位組成:1位起始位,8位數據位,1位停止位
試驗(1.1)
發方:9600,N,8,1(發出的數據位數為8)
收方:9600,N,8,1
解讀:協議完全匹配,所有數據均能被正確收到。?
?
試驗(1.2)
發方:9600,N,8,1(發出的數據位數為8)
收方:9600,O,8,1
解讀:此時發送方的停止位被接收方當作校驗位,由于是奇校驗,而此時的校驗位為1,所以只有含有偶數個1的那些數據才能被PC正確收到,比如00H,03H,05H,06H,09H,0AH,0CH,0FH等。(發生校驗錯的那些數據在后面能校驗通過的數據被收到時才被輸出,輸出為5BH)?
?
試驗(1.3)
發方:9600,N,8,1(發出的數據位數為8)
收方:9600,E,8,1
解讀:此時發送方的停止位被接收方當作校驗位,由于是偶校驗,而此時的校驗位為1,所以只有含有奇數個1的那些數據才能被PC正確收到,比如01H,02H,04H,07H,08H,0BH,0DH,0EH等。(發生校驗錯的那些數據在后面能校驗通過的數據被收到時才被輸出,輸出為5BH)?
?
試驗(1.4)
發方:9600,N,8,1(發出的數據位數為8)
收方:9600,M,8,1
解讀:此時發送方的停止位被接收方當作校驗位,由于要求校驗位為1而此時的校驗位恰好為1,所以所有數據都能被PC正確收到。
?
試驗(1.5)
發方:9600,N,8,1(發出的數據位數為8)
收方:9600,S,8,1
解讀:此時發送方的停止位被接收方當作校驗位,由于要求校驗位為0而此時的校驗位恰好為1,所以所有數據都不能被PC正確收到。?
?
第二組試驗:發送方發送的1個數據楨有11位組成:1位起始位,8位數據位,1位校驗位(該位固定為1),1位停止位。由于校驗位為1,所以只要不是數據一個接一個地連續發送,在時序上和不含校驗位的第一組試驗中發出的數據完全一致。
試驗(2.1)
發方:9600,M,8,1(發出的數據位數為9,第9位為1)
收方:9600,N,8,1
解讀:此時發送方的第9位為1,由于接收方使用無校驗,發送方的第9位被接收方當作是停止位,所以發送方發送的所有數據都能被PC正確收到。
?
試驗(2.2)
發方:9600,M,8,1(發出的數據位數為9,第9位為1)
收方:9600,O,8,1
解讀:此時發送方的第9位即校驗為1,由于是奇校驗,而此時的校驗位為1,所以只有含有偶數個1的那些數據才能被PC正確收到,比如00H,03H,05H,06H,09H,0AH,0CH,0FH等。(發生校驗錯的那些數據在后面能校驗通過的數據被收到時才被輸出,輸出為5BH)?
?
試驗(2.3)
發方:9600,M,8,1(發出的數據位數為9,第9位為1)
收方:9600,E,8,1
解讀:此時發送方的第9位即校驗位為1,由于是偶校驗,而此時的校驗位為1,所以只有含有奇數個1的那些數據才能被PC正確收到,比如01H,02H,04H,07H,08H,0BH,0DH,0EH等。(發生校驗錯的那些數據在后面能校驗通過的數據被收到時才被輸出,輸出為5BH)
?
試驗(2.4)
發方:9600,M,8,1(發出的數據位數為9,第9位為1)
收方:9600,M,8,1
解讀:此時發送方的第9位即校驗為1,由于要求校驗位為1而此時的校驗位恰好為1,所以所有數據都能被PC正確收到。?
?
試驗(2.5)
發方:9600,M,8,1(發出的數據位數為9,第9位為1)
收方:9600,S,8,1
解讀:此時發送方的第9位即校驗為1,由于要求校驗位為0而此時的校驗位恰好為1,所以沒有數據能被PC正確收到。
?
第三組試驗:發送方發送的1個數據楨有11位組成:1位起始位,8位數據位,1位校驗位(該位固定為0),1位停止位。
試驗(3.1)
發方:9600,S,8,1(發出的數據位數為9,第9位為0)
收方:9600,N,8,1
疑惑:此時發送方的第9位為0,由于接收方使用無校驗,發送方的第9位被接收方當作是停止位,此時停止位為0,應該發生幀錯誤,怎么發送方發送的所有數據都能被PC正確收到呢???
試驗(3.2)
發方:9600,S,8,1(發出的數據位數為9,第9位為0)
收方:9600,O,8,1
解讀:此時發送方的第9位即校驗為0,由于是奇校驗,而此時的校驗位為0,所以只有含有奇數個1的那些數據才能被PC正確收到,比如01H,02H,04H,07H,08H,0BH,0DH,0EH等。(發生校驗錯的那些數據在后面能校驗通過的數據被收到時才被輸出,輸出為5BH)
?
試驗(3.3)
發方:9600,S,8,1(發出的數據位數為9,第9位為0)
收方:9600,E,8,1
解讀:此時發送方的第9位即校驗為0,由于是偶校驗,而此時的校驗位為0,所以只有含有偶數個1的那些數據才能被PC正確收到,比如00H,03H,05H,06H,09H,0AH,0CH,0FH等。(發生校驗錯的那些數據在后面能校驗通過的數據被收到時才被輸出,輸出為5BH)
?
試驗(3.4)
發方:9600,S,8,1(發出的數據位數為9,第9位為0)
收方:9600,M,8,1
解讀:此時發送方的第9位即校驗為0,由于是1校驗,而此時的校驗位為0,所以收不到任何數據。
?
試驗(3.5)
發方:9600,S,8,1(發出的數據位數為9,第9位為0)
收方:9600,S,8,1
解讀:此時發送方的第9位即校驗位為0,由于是0校驗,而此時的校驗位為0,所以所有數據均可正確地收到。
MSComm控件發出9位數據的方法
from: http://blog.sina.com.cn/s/blog_470eccc60100arpo.html
使用8051單片機進行主從式多機串行通訊時,使用TB8/RB8區分地址或數據是一種常見的處理方式。如果主機是51系列單片機,利用串口工作方式2或3可方便地實現此功能。
如果主機是PC呢?通過資料查詢,發現正確設置串口控件MSComm的Settings屬性可完成此功能,具體是:
將串口控件MSComm的Settings屬性中的奇偶校驗項設置為“M”(Mark)可使所發數據的第9位為1;將Settings屬性中的奇偶校驗項設置為“S”(Space)可使所發數據的第9位為0。
將第9位設置為1的另一方法是將Settings屬性中的奇偶校驗項設置為“N”(None)同時將停止位設置為2,利用多發出的1位停止位使得下位機收到數據的第9位為1。
那么這些屬性的設置影響PC對從機發出的數據的奇偶校驗的檢測呢?比如,如果設置“M”,那么一定要求從機發出的數據的第9位必須為1呢?
實驗表明:是的,否則將收不到數據。
但如果將Settings屬性中的奇偶校驗項設置為“N”(None)同時將停止位設置為2時,發送時的效果和將Settings屬性中的奇偶校驗項設置為“M”(Mark)同時將停止位設置為1的效果完全一致,但接收時的處理卻不盡一致。如果設置校驗為“M”,那么發出的數據中第9位必須為1,接收方才能收到;而設置為無校驗,試驗中發現,即使第9位為0(此時被當作停止位中的第1位),數據照樣能被收到。
所以,主機、從機的軟件設計時需要特別注意這其中的細微差別,正確設置MSCOMM控件的Settings屬性,免得調試莫名遇阻。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的串口MSComm控件五种不同校验方式对数据收发的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS,重启的常用命令
- 下一篇: MATLAB中用FDATool设计滤波器