如何計算ModBus超時時間?


波特率:每秒鍾通過信道傳輸的信息量稱為位傳輸速率,也就是每秒鍾傳送的二進制位數,簡稱比特率比特率表示有效數據的傳輸速率,用b/s 、bit/s、比特/秒,讀作:比特每秒。

如9600b/s:指總線上每秒可以傳輸9600個bit;

通常的串口楨格式為:開始位1bit + 數據位8bit + 停止位1bit

也就是說:在9600的波特率下,每秒可以傳輸出的楨數為:9600 / (1 + 8 + 1) = 960楨/秒,即960字節/秒;

反推:一楨或一字節所需要的時間是多少呢?

1秒 / 960 = 1.4ms

而ModBus協議中超時時間定為:3.5個楨長度為超時時間;

超時時間 = 3.5 * 1 / BaudRate / 10              秒

              = 3.5 * 10 / BaudRate                   秒

              = 3.5 * 10  * 2 / BaudRate  *2        秒

              =  70 / BaudRate  *2                     秒

 

FreeModBus是這個樣實現的:

 1 /* If baudrate > 19200 then we should use the fixed timer values
 2  * t35 = 1750us. Otherwise t35 must be 3.5 times the character time.
 3  */
 4 if( ulBaudRate > 19200 )
 5 {
 6     usTimerT35_50us = 35;       /* 1800us. */
 7 }
 8 else
 9 {
10     /* The timer reload value for a character is given by:
11     *
12     * ChTimeValue = Ticks_per_1s / ( Baudrate / 11 )
13     *             = 11 * Ticks_per_1s / Baudrate
14     *             = 220000 / Baudrate
15     * The reload for t3.5 is 1.5 times this value and similary
16     * for t3.5.
17     */
18     usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate );
19 }

 

波特率大於19200使用定值:1750us

波特率小於19200使用定值:usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate ); 這usTimerT35_50us 一個單位為50uS,將這個計算結果寫到定時器。每中斷一次為50us * usTimerT35_50us   微秒;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM