計算機和數(shù)字處理芯片之間通過RS232進行 ASCII通信時,可以按如下過程檢測RS232串口波特率。
[0066] 以表格的形式記錄所述RS232的每個串口波特率對應(yīng)傳輸1個比特位所需時長的 1倍至10倍的數(shù)值之后,進行如下步驟:
[0067] (1)將RS232串口波特率的每個波特率的一個比特的時長以檢測時鐘周期為單位 表示成十進制數(shù)。時鐘頻率只要大于115200波特率數(shù)據(jù)周期的2倍即可。為計算方便,這 里檢測時鐘周期采用115200波特率數(shù)據(jù)周期的1/16,當然時鐘周期也可以采用115200波 特率數(shù)據(jù)周期1/2、1/4、1/8、1/32等。
[0068] 設(shè)1200波特對應(yīng)Tl,2400波特對應(yīng)T2,4800波特對應(yīng)T3,9600波特對應(yīng)T4,19200 波特對應(yīng) T5, 38400 波特對應(yīng) T6,115200 波特對應(yīng) T7,計算 Ti(i = l,2,3,4,5,6,7),2Ti, 3Ti,4Ti,5Ti,6Ti,7Ti,8Ti,9Ti,IOTi。將計算的值用二進制表示,所有數(shù)值列在一個表格 中并預(yù)先存儲在數(shù)字信號處理芯片中。
[0069] 示例性的如表1所示,表1的行分別表示各波特率數(shù)據(jù)周期的1到10倍,計量單 位為115200波特率數(shù)據(jù)周期的1/16,行表示波特率。這里為了節(jié)省空間數(shù)值按10進制列 出。
[0070] 表 1
[0071]
[0072] (2)檢測接收到的數(shù)據(jù)字是否是ASCII碼"\null":檢測開始電平后第一個低電平 的時長。如果第一個低電平的時長不是某一波特速率一個比特時長的10倍或9倍,則接收 到的數(shù)據(jù)字必定不是ASCII碼"\null"。"\null"的ASCII碼是二進制碼"00000000"。
[0073] 這是因為如果接收到的數(shù)據(jù)字是"\null",則其數(shù)據(jù)結(jié)構(gòu)如圖4所示,圖4和圖2 類似,但bit〇-bit7均為低電平數(shù)字信號0。校驗位是數(shù)字信號0時從起始位開始為連續(xù) 10個數(shù)字信號〇,無校驗位或校驗位為數(shù)字信號1時從起始位開始為連續(xù)9個數(shù)字信號0。
[0074] 如果檢測到開始電平后第一個低電平的時長是某一速率一個比特時長的9倍,由 表1可知其對應(yīng)的波特率是唯一的,由表1可以查得其對應(yīng)的波特率。這是由于表1中的 數(shù)值存在因數(shù)9的數(shù)據(jù)只在9Ti列且該列各數(shù)據(jù)互不相同。且不存在第一個低電平的時長 是某一速率一個比特時長的18倍或36倍或9*2η (η = 1,2,…)的情況。
[0075] 示例性的,以18倍為例說明原因:開始電平后第一個低電平的時長是某一速率一 個比特時長的9倍,數(shù)據(jù)結(jié)構(gòu)如圖4所示,若按18倍的情況,圖4中的起始位后至少有16 個數(shù)字信號〇,則結(jié)束位必為數(shù)字信號〇,但實際上按RS232協(xié)議結(jié)束位一定是數(shù)字信號1, 因此與實際的RS232協(xié)議的數(shù)據(jù)結(jié)構(gòu)矛盾,所以當檢測到開始電平后第一個低電平的時長 是某一速率一個比特時長的9倍時,其對應(yīng)的波特率是唯一的。
[0076] 進一步的,如果檢測到開始電平后第一個低電平的時長是某一速率一個比特時長 的10倍(或存在因數(shù)5),由表1可知其對應(yīng)的波特率是只在的5Ti列和IOTi列且必存在 校驗位(這是因為不存在校驗位時起始位后有9個數(shù)字信號0,為9的倍數(shù),不存在因數(shù)5)。 其可能的波特率只有兩個且為2倍關(guān)系。其他的倍數(shù)不可能出現(xiàn),原因和上述9倍的情況 相同。這里以4倍的情況為例說明原因:若可能的波特率存在4倍關(guān)系,圖5中的起始位后 至少有32個數(shù)字信號0,則結(jié)束位必為數(shù)字信號0,但實際上按RS232協(xié)議結(jié)束位一定是數(shù) 字信號1,其他的倍數(shù)依次類推,都可以導致結(jié)束位為數(shù)字〇的情況,與實際的數(shù)據(jù)結(jié)構(gòu)(圖 4實際的結(jié)束位為數(shù)字信號1)矛盾,所以其可能的波特率只有兩個且為2倍關(guān)系。按圖5 所示,數(shù)據(jù)的起始位、bit7必為數(shù)字信號0而結(jié)束位必為數(shù)字信號1。為了進一步確定數(shù)據(jù) 的波特率,這時分別用這兩個可能的波特率接收數(shù)據(jù),檢查接收的后續(xù)數(shù)據(jù)的起始位、bit7 和結(jié)束位,出現(xiàn)矛盾的波特率就可以排除。實際的驗證表明,只要接收5個數(shù)據(jù)就可以完全 確定數(shù)據(jù)的實際波特率。
[0077] (3)如果接收數(shù)據(jù)字非"\nul 1 ",由于bit7位總為數(shù)字信號0,所以圖4中 bit〇-bit6中必有至少一個比特位非零,否則比特位全是數(shù)字信號0,接收數(shù)據(jù)就成為 "\nul 1 ",這與接收數(shù)據(jù)非"\nul 1 "的斷定矛盾。
[0078] 接收數(shù)據(jù)非"\null"時的實際數(shù)據(jù)結(jié)構(gòu)如圖5所示。其中數(shù)據(jù)段1、數(shù)據(jù)段3和校 驗位可能是高電平也可能是低電平,可能存在也可能不存在,而數(shù)據(jù)段2必然存在且為高 電平。數(shù)據(jù)段1,2,3合在一起即為bit〇-bit6。由于ASCII碼范圍為0-127,所以bit7仍 然總是為低電平。
[0079] 根據(jù)圖5的數(shù)據(jù)結(jié)構(gòu)特點,在波特率未知情況下,可以斷定起始位后必然有一段 低電平,其后必然有至少有一比特高電平,而高電平之后必然有至少1比特低電平(由于 bit7 = '0'),這個順序是確定無疑的,如圖6所示。
[0080] 進一步的,圖6中的低電平數(shù)據(jù)段1為低電平,其時間寬度可以是0 ;高電平數(shù)據(jù) 段2的寬度至少lbit,且為高電平;低電平數(shù)據(jù)段3可能包括bit7也可能不包括bit7,其 寬度至少lbit,且為低電平。
[0081] 根據(jù)圖6中的高低電平順序特點,可以得到一個結(jié)論:檢測到的可能的波特率最 多只能存在2倍關(guān)系。因為對一個可能的波特率,圖6中從起始位到低電平數(shù)據(jù)段3結(jié)束的 最短數(shù)據(jù)為二進制" 10",如果其4倍波特率也是可能的,則起始位后最短二進制" 10"成為 二進制數(shù)"00011110000",其第9、10位均為"0",而這兩位必是校驗位和停止位,而按RS232 協(xié)議,停止位必為" 1",形成矛盾,所以4倍波特率關(guān)系不可能存在。而其他的如8、16、32等 倍數(shù)關(guān)系按相同的道理也不可能存在。所以檢測到的可能的波特率最多只能存在2倍關(guān)系 的結(jié)論是正確的。
[0082] 因此,這種情況下數(shù)據(jù)的特點如下:
[0083] (A)起始位為低電平;
[0084] (B)高低電平的順序如圖6所示;
[0085] (C)bit7為低電平,如圖5所示;
[0086] (D)結(jié)束位為高電平,如圖5所示;
[0087] (E)圖5中起始位之后的全部高低電平均屬于一個數(shù)據(jù)字,其長度以比特為單位 是整數(shù),其總長度不超過l〇bit。
[0088] 根據(jù)這四個特點可以對RS232串口波特率進行檢測,方法如下:
[0089] 第一步:檢測圖6中從起始位開始的低電平的時長TB+TD1 (即第一低電平的時 長);檢測高電平數(shù)據(jù)段的時長TD2(即第一高電平的時長);檢測低電平數(shù)據(jù)段3的時長 TD3(即第二低電平的時長)。這三個數(shù)均為正整數(shù)。
[0090] 第二步:檢驗(TB+TD1)、TD2和TD3是否存在約數(shù)5或7,如果存在,設(shè)TD2有約數(shù) 5或7,則TD2約去這個相應(yīng)的約數(shù)即為數(shù)據(jù)的波特率。這個結(jié)論的證明和前面第3步相應(yīng) 于開始電平后第一個低電平的時長是某一速率一個比特時長的9倍波特率的類似。如果不 存在約數(shù)5或7轉(zhuǎn)下一步。
[0091] 第三步:檢驗(TB+TD1)、TD2和TD3是否存在約數(shù)3,如果存在,設(shè)TD2有約數(shù)3,則 TD2約去3所得的數(shù)和其2倍即為數(shù)據(jù)的兩個可能波特率。分別用這兩個波特率接收數(shù)據(jù) 并用特點(A) (C) (D)檢驗接收的數(shù)據(jù),出現(xiàn)矛盾的波特率就可以排除。實際的驗證表明,只 要接收5個數(shù)據(jù)就可以完全確定數(shù)據(jù)的實際波特率。如果不存在約數(shù)3轉(zhuǎn)下一步。
[0092] 第四步:計算(TB+TD1)、TD2和TD3的最大公約數(shù),這個值和其2倍即為數(shù)據(jù)的兩 個可能波特率。分別用這兩個波特率接收數(shù)據(jù)并用特點(A) (C) (D)檢驗接收的數(shù)據(jù),出現(xiàn) 矛盾的波特率就可以排除。實際的驗證表明,只要接收5個數(shù)據(jù)就可以完全確定數(shù)據(jù)的實 際波特率。
[0093] 需要說明的是,本發(fā)明實施例是在檢測時鐘周期為115200波特率數(shù)據(jù)周期的l/2n 的基礎(chǔ)上對本發(fā)明的技術(shù)方案進行闡述的,本領(lǐng)域技術(shù)人員可以理解的,當檢測時鐘周期 為115200波特率數(shù)據(jù)周期的l/m,m為大于2的其他任意自然數(shù)時,本發(fā)明的技術(shù)方案也是 適用的,只不過方案中涉及到的具體數(shù)值要根據(jù)m的值做相應(yīng)調(diào)整。
[0094] 本發(fā)明實施例提供的檢測RS232串口波特率的方法,對常見的計算機和數(shù)字處理 芯片之間通過R