如何提高串口通信速度
串口通信簡(jiǎn)介
串口是計(jì)算機(jī)上一種非常通用設(shè)備通信的協(xié)議。大多數(shù)計(jì)算機(jī)包含兩個(gè)基于RS232的串口。串口同時(shí)也是儀器儀表設(shè)備通用的通信協(xié)議;很多GPIB兼容的設(shè)備也帶有RS-232口。同時(shí),串口通信協(xié)議也可以用于獲取遠(yuǎn)程采集設(shè)備的數(shù)據(jù)。
串口通信結(jié)構(gòu)
串口通信是指外設(shè)和計(jì)算機(jī)間,通過(guò)數(shù)據(jù)信號(hào)線 、地線、控制線等,按位進(jìn)行傳輸數(shù)據(jù)的一種通訊方式。這種通信方式使用的數(shù)據(jù)線少,在遠(yuǎn)距離通信中可以節(jié)約通信成本,但其傳輸速度比并行傳輸?shù)汀?/p>
串口是計(jì)算機(jī)上一種非常通用的設(shè)備通信協(xié)議。大多數(shù)計(jì)算機(jī)(不包括筆記本電腦)包含兩個(gè)基于RS-232的串口。串口同時(shí)也是儀器儀表設(shè)備通用的通信協(xié)議;很多GPIB兼容的設(shè)備也帶有RS-232口。同時(shí),串口通信協(xié)議也可以用于獲取遠(yuǎn)程采集設(shè)備的數(shù)據(jù)。
RS-232(ANSI/EIA-232標(biāo)準(zhǔn))是IBM-PC及其兼容機(jī)上的串行連接標(biāo)準(zhǔn)??捎糜谠S多用途,比如連接鼠標(biāo)、打印機(jī)或者M(jìn)odem,同時(shí)也可以接工業(yè)儀器儀表。用于驅(qū)動(dòng)和連線的改進(jìn),實(shí)際應(yīng)用中RS-232的傳輸長(zhǎng)度或者速度常常超過(guò)標(biāo)準(zhǔn)的值。RS-232只限于PC串口和設(shè)備間點(diǎn)對(duì)點(diǎn)的通信。RS-232串口通信最遠(yuǎn)距離是50英尺。
串口通信原理
串口通信的概念非常簡(jiǎn)單,串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。它很簡(jiǎn)單并且能夠?qū)崿F(xiàn)遠(yuǎn)距離通信。比如IEEE488定義并行通行狀態(tài)時(shí),規(guī)定設(shè)備線總長(zhǎng)不得超過(guò)20米,并且任意兩個(gè)設(shè)備間的長(zhǎng)度不得超過(guò)2米;而對(duì)于串口而言,長(zhǎng)度可達(dá)1200米。典型地,串口用于ASCII碼字符的傳輸。通信使用3根線完成:(1)地線,(2)發(fā)送,(3)接收。由于串口通信是異步的,端口能夠在一根線上發(fā)送數(shù)據(jù)同時(shí)在另一根線上接收數(shù)據(jù)。其他線用于握手,但是不是必須的。串口通信最重要的參數(shù)是波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)。對(duì)于兩個(gè)進(jìn)行通信的端口,這些參數(shù)必須匹配:
1、波特率
這是一個(gè)衡量通信速度的參數(shù)。它表示每秒鐘傳送的bit的個(gè)數(shù)。例如300波特表示每秒鐘發(fā)送300個(gè)bit。當(dāng)我們提到時(shí)鐘周期時(shí),我們就是指波特率例如如果協(xié)議需要4800波特率,那么時(shí)鐘是4800Hz。這意味著串口通信在數(shù)據(jù)線上的采樣率為4800Hz。通常電話線的波特率為14400,28800和36600。波特率可以遠(yuǎn)遠(yuǎn)大于這些值,但是波特率和距離成反比。高波特率常常用于放置的很近的儀器間的通信,典型的例子就是GPIB設(shè)備的通信。
2、數(shù)據(jù)位
這是衡量通信中實(shí)際數(shù)據(jù)位的參數(shù)。當(dāng)計(jì)算機(jī)發(fā)送一個(gè)信息包,實(shí)際的數(shù)據(jù)不會(huì)是8位的,標(biāo)準(zhǔn)的值是5、7和8位。如何設(shè)置取決于你想傳送的信息。比如,標(biāo)準(zhǔn)的ASCII碼是0~127(7位)。擴(kuò)展的ASCII碼是0~255(8位)。如果數(shù)據(jù)使用簡(jiǎn)單的文本(標(biāo)準(zhǔn) ASCII碼),那么每個(gè)數(shù)據(jù)包使用7位數(shù)據(jù)。每個(gè)包是指一個(gè)字節(jié),包括開(kāi)始/停止位,數(shù)據(jù)位和奇偶校驗(yàn)位。由于實(shí)際數(shù)據(jù)位取決于通信協(xié)議的選取,術(shù)語(yǔ)“包”指任何通信的情況。
3、停止位
用于表示單個(gè)包的最后一位。典型的值為1,1.5和2位。由于數(shù)據(jù)是在傳輸線上定時(shí)的,并且每一個(gè)設(shè)備有其自己的時(shí)鐘,很可能在通信中兩臺(tái)設(shè)備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供計(jì)算機(jī)校正時(shí)鐘同步的機(jī)會(huì)。適用于停止位的位數(shù)越多,不同時(shí)鐘同步的容忍程度越大,但是數(shù)據(jù)傳輸率同時(shí)也越慢。
4、奇偶校驗(yàn)位
在串口通信中一種簡(jiǎn)單的檢錯(cuò)方式。有四種檢錯(cuò)方式:偶、奇、高和低。當(dāng)然沒(méi)有校驗(yàn)位也是可以的。對(duì)于偶和奇校驗(yàn)的情況,串口會(huì)設(shè)置校驗(yàn)位(數(shù)據(jù)位后面的一位),用一個(gè)值確保傳輸?shù)臄?shù)據(jù)有偶個(gè)或者奇?zhèn)€邏輯高位。例如,如果數(shù)據(jù)是011,那么對(duì)于偶校驗(yàn),校驗(yàn)位為0,保證邏輯高的位數(shù)是偶數(shù)個(gè)。如果是奇校驗(yàn),校驗(yàn)位為1,這樣就有3個(gè)邏輯高位。高位和低位不真正的檢查數(shù)據(jù),簡(jiǎn)單置位邏輯高或者邏輯低校驗(yàn)。這樣使得接收設(shè)備能夠知道一個(gè)位的狀態(tài),有機(jī)會(huì)判斷是否有噪聲干擾了通信或者是否傳輸和接收數(shù)據(jù)是否不同步。
串口通信的傳輸速率與傳輸距離
1、波特率
在串行通信中,用 “ 波特率 ” 來(lái)描述數(shù)據(jù)的傳輸速率。所謂波特率,即每秒鐘傳送的二進(jìn)制位數(shù),其單位為 bps ( bits per second )。它是衡量串行數(shù)據(jù)速度快慢的重要指標(biāo)。有時(shí)也用 “ 位周期 ” 來(lái)表示傳輸速率,位周期是波特率的倒數(shù)。國(guó)際上規(guī)定了一個(gè)標(biāo)準(zhǔn)波特率系列: 110 、 300 、 600 、 1200 、 1800 、 2400 、4800 、 9600 、 14.4Kbps 、 19.2Kbps 、 28.8Kbps 、 33.6Kbps 、 56Kbps 。 例如: 9600bps ,指每秒傳送 9600 位,包含字符的數(shù)位和其它必須的數(shù)位,如奇偶校驗(yàn)位等。 大多數(shù)串行接口電路的接收波特率和發(fā)送波特率可以分別設(shè)置,但接收方的接收波特率必須與發(fā)送方的發(fā)送波特率相同。通信線上所傳輸?shù)淖址麛?shù)據(jù)(代碼)是逐為位傳送的, 1 個(gè)字符由若干位組成,因此每秒鐘所傳輸?shù)淖址麛?shù)(字符速率)和波特率是兩種概念。在串行通信中,所說(shuō)的傳輸速率是指波特率,而不是指字符速率,它們兩者的關(guān)系是:假如在異步串行通信中,傳送一個(gè)字符,包括 12 位(其中有一個(gè)起始位, 8 個(gè)數(shù)據(jù)位, 2 個(gè)停止位),其傳輸速率是 1200b/s ,每秒所能傳送的字符數(shù)是 1200/(1+8+1+2)=100 個(gè)。
2、發(fā)送/接收時(shí)鐘
在串行傳輸過(guò)程中,二進(jìn)制數(shù)據(jù)序列是以數(shù)字信號(hào)波形的形式出現(xiàn)的,如何對(duì)這些數(shù)字波形定時(shí)發(fā)送出去或接收進(jìn)來(lái),以及如何對(duì)發(fā)/收雙方之間的數(shù)據(jù)傳輸進(jìn)行同步控制的問(wèn)題就引出了發(fā)送/接收時(shí)鐘的應(yīng)用。
在發(fā)送數(shù)據(jù)時(shí),發(fā)送器在發(fā)送時(shí)鐘(下降沿)作用下將發(fā)送移位寄存器的數(shù)據(jù)按串行移位輸出;在接收數(shù)據(jù)時(shí),接收器在接收時(shí)鐘(上升鹽)作用下對(duì)來(lái)自通信線上串行數(shù)據(jù),按位串行移入移位寄存器??梢?jiàn),發(fā)送/接收時(shí)鐘是對(duì)數(shù)字波形的每一位進(jìn)行移位操作,因此,從這個(gè)意義上來(lái)講,發(fā)送/接收時(shí)鐘又可叫做移位始終脈沖。另外,從數(shù)據(jù)傳輸過(guò)程中,收方進(jìn)行同步檢測(cè)的角度來(lái)看,接收時(shí)鐘成為收方保證正確接收數(shù)據(jù)的重要工具。為此,接收器采用比波特率更高頻率的時(shí)鐘來(lái)提高定位采樣的分辨能力和抗干擾能力。
3、波特率因子
在波特率指定后,輸入移位寄存器 / 輸出移位寄存器在接收時(shí)鐘 / 發(fā)送時(shí)鐘控制下,按指定的波特率速度進(jìn)行移位。一般幾個(gè)時(shí)鐘脈沖移位一次。要求:接收時(shí)鐘/ 發(fā)送時(shí)鐘是波特率的 16 、 32 或 64 倍。波特率因子就是發(fā)送/接收 1 個(gè)數(shù)據(jù)( 1 個(gè)數(shù)據(jù)位)所需要的時(shí)鐘脈沖個(gè)數(shù),其單位是個(gè)/位。如波特率因子為 16 ,則16 個(gè)時(shí)鐘脈沖移位 1 次。 例:波特率 =9600bps ,波特率因子 =32 ,則接收時(shí)鐘和發(fā)送時(shí)鐘頻率 =9600 × 32=297200Hz 。
4、傳輸距離
串行通信中,數(shù)據(jù)位信號(hào)流在信號(hào)線上傳輸時(shí),要引起畸變,畸變的大小與以下因素有關(guān):
波特率 -- 信號(hào)線的特征(頻帶范圍)
傳輸距離 -- 信號(hào)的性質(zhì)及大小(電平高低、電流大?。?當(dāng)畸變較大時(shí),接收方出現(xiàn)誤碼。
在規(guī)定的誤碼率下,當(dāng)波特率、信號(hào)線、信號(hào)的性質(zhì)及大小一定時(shí),串行通信的傳輸距離就一定。為了加大傳輸距離,必須加MODEM。
如何提高串口通信速度(舉例說(shuō)明)
硬件工程師開(kāi)發(fā)了一塊單片機(jī)板,只要按通信協(xié)議上位機(jī)發(fā)數(shù)據(jù)給下位機(jī),下位機(jī)立即回?cái)?shù)據(jù),我用串口調(diào)試助手試過(guò)了,1分鐘約可以收發(fā)最大6000,可是我用VB的MSCOMM編程,計(jì)時(shí),1分鐘約2400次,如何提高速度?要求是3600次以內(nèi)。除出代碼,計(jì)算機(jī)高速運(yùn)行?
你試的數(shù)據(jù)有多大?。烤鸵淮我粋€(gè)字符那肯定快了。
計(jì)算機(jī)高速運(yùn)行,僅僅是消息處理的速度快了。
速度也是受波特率限制的,你把波特率提高一點(diǎn)不就相對(duì)快很多了嗎?
發(fā)5個(gè)字節(jié),收4個(gè)字節(jié),串口調(diào)試助手1分鐘最大約6000次,VB的MSCOMM編程2400次,
是否API會(huì)快些?
字節(jié)到緩沖區(qū),出去串口?直接用底層的API快些?
大哥,不要玩我呀?只是個(gè)EXE,哪有源程序?而且好像很慢????
字節(jié)到緩沖區(qū),到串口,不通過(guò)控件,直接從API走?
那么波特率9600的話 就是能發(fā)6萬(wàn)個(gè)字符 跑去亂七八糟的時(shí)間 如果單片機(jī)程序?qū)懙迷贍€,發(fā)3600個(gè)字符沒(méi)啥問(wèn)題。
所以你的問(wèn)題應(yīng)該出現(xiàn)在串口助手編寫(xiě)的有點(diǎn)對(duì)付不了這種高速發(fā)數(shù)的情況
1、更改到更高的波特率
2、 如果用VB的MSCOMM,可以:
1)不要用查詢方式,而應(yīng)事件方式,使用OnComm事件,并且不要在里面使用界面處理代碼,如不要用類(lèi)似這樣的代碼:Text1.Text = Text1.Text & Recv_Char
2)因?yàn)槊看味际?個(gè)字節(jié),所以可以設(shè)置Rthreshold=4,至少收到4個(gè)字符才觸發(fā)一次OnComm事件,節(jié)省三次事件調(diào)用時(shí)間。
3)收到數(shù)據(jù)后,立即發(fā)送,利用對(duì)方發(fā)送時(shí)間內(nèi)做數(shù)據(jù)處理。
1、應(yīng)該不是波特率的問(wèn)題。要改波特率,必須和底層一起改?,F(xiàn)在的情況是,串口助手可以滿足你的速率要求,而自己寫(xiě)的程序比較慢。
2、不要用 Timer 這類(lèi)方式去查詢串口的接收狀態(tài)。用 OnComm 事件或循環(huán)查詢都可以。注意一下你接收到數(shù)據(jù)后再發(fā)命令是如何銜接的。
3、對(duì)于串口這種低速接口,如果沒(méi)有特殊的連續(xù)設(shè)置改變,我認(rèn)為控件和 API 的差別不大。
再次謝謝myjian,SupermanKing?,F(xiàn)在是存在這個(gè)需求,目的是找最佳的方案去解決問(wèn)題。因?yàn)槲也皇祢?qū)動(dòng),所以采用編寫(xiě)驅(qū)動(dòng)的方案從時(shí)效上來(lái)說(shuō),可行性不強(qiáng)。
看來(lái)得考慮下方案三:RING3方案,把目標(biāo)進(jìn)程的ReadFile與WriteFile給HOOK了。。。。。。。
其實(shí)有個(gè)簡(jiǎn)單的方法,找個(gè)虛擬串口的源碼。運(yùn)行此虛擬串口程序時(shí)建1個(gè)虛擬串口(如com10),把那個(gè)軟件的串口號(hào)由com1改為com10,你就可接到數(shù)據(jù)了,然后此虛擬程序再將數(shù)據(jù)轉(zhuǎn)發(fā)到com1去。
反之則由com1接收,再轉(zhuǎn)發(fā)到com10。就是用虛擬串口程序做個(gè)轉(zhuǎn)發(fā),順便就監(jiān)聽(tīng)了
有個(gè)簡(jiǎn)單的想法,HOOK軟的不如HOOK硬的簡(jiǎn)單點(diǎn):
直接作個(gè)串口一拖二的線,其中一個(gè)口反接成對(duì)聯(lián)線,插到另一個(gè)串口上就可以監(jiān)視串口事件了。
對(duì)于3線通訊的串口來(lái)說(shuō)應(yīng)該是很簡(jiǎn)單的.
非常好我支持^.^
(1) 25%
不好我反對(duì)
(3) 75%
相關(guān)閱讀:
- [電子說(shuō)] STM32速成筆記(5)—串口通信 2023-10-24
- [控制/MCU] 基于STM32中串口通信的實(shí)例分析 2023-10-17
- [電子說(shuō)] 什么是奇校驗(yàn)和偶校驗(yàn)?常見(jiàn)的奇偶校驗(yàn)方式有哪些? 2023-10-17
- [電子說(shuō)] 串口通信奇偶檢驗(yàn)什么意思 為什么要使用奇偶檢驗(yàn) 怎么使用奇偶檢驗(yàn) 2023-10-17
- [控制/MCU] 單片機(jī)經(jīng)典電路設(shè)計(jì)的11種電路圖 2023-10-13
- [電子說(shuō)] 【藍(lán)橋杯嵌入式】第六章 串口通信理論知識(shí) 2023-10-10
- [接口/總線/驅(qū)動(dòng)] 串口通信、232、485的區(qū)別 2023-10-08
- [接口/總線/驅(qū)動(dòng)] 關(guān)于門(mén)禁系統(tǒng)的串口通信相關(guān)知識(shí)點(diǎn) 2023-09-21
( 發(fā)表人:陳翠 )