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