作為鐵路院校畢業(yè)的學(xué)生隅茎,難免和鐵路設(shè)備打交道草巡。機(jī)車安全信息綜合檢測裝置(簡稱TAX箱)就是這樣一個(gè)奇葩的設(shè)備,數(shù)據(jù)輸出的波特率為28800.而通用的串口波特率設(shè)置方法并沒有配置成這個(gè)波特率的方法庆锦。沒有辦法辫继,只能查資料。各種搜索引擎嘗試了之后锌半,發(fā)現(xiàn)也有同僚遇到這種問題禽车,但是基本所有的搜索條目都指向了同一個(gè)帖子,或者其復(fù)制品刊殉。而這個(gè)帖子只給出了思路和部分代碼哭当,沒有給出可運(yùn)行的程序,無奈冗澈,只能自己去嘗試钦勘,去修改,去完善亚亲,最終成功搞定彻采,記錄一下,供后來人使用捌归,如需轉(zhuǎn)載,請注明出處,謝謝猎物。
對于非標(biāo)準(zhǔn)的任意波特率需要用ioctl(fd, TIOCGSERIAL, p)和ioctl(fd, TIOCSSERIAL, p)的配合,ioctl的最后一個(gè)參數(shù)是struct serial_struct *類型角塑,在linux/serial.h中定義蔫磨。其中baud_base是基準(zhǔn)晶振頻率/16,通常是115200圃伶,你需要設(shè)的是custom_divisor這個(gè)值堤如,最終的波特率為baud_base/custom_divisor蒲列,比如你需要28800,因?yàn)?15200/4=28800搀罢,所以要設(shè)置custom_divisor=4蝗岖,。
具體過程為榔至,先設(shè)置波特率設(shè)為38400(tcsetattr)剪侮,然后用TIOCGSERIAL得到當(dāng)前的設(shè)置瓣俯,將flags設(shè)置ASYNC_SPD_CUST位,設(shè)置custom_divisor兵怯,最后用TIOCSSERIAL設(shè)置彩匕。
使用setserial其實(shí)就是利用上述方法,來設(shè)置baud_base, custom_divisor等, 其內(nèi)部實(shí)現(xiàn)就是使用ioctl來進(jìn)行設(shè)置。
網(wǎng)上的東西真的是參差不齊媒区,希望能呈現(xiàn)完善的正確的Blog給大家驼仪。附代碼如下,如有疑問宙攻,歡迎留言討論奠货。由于是測試代碼,只是保證可以運(yùn)行座掘。另外推薦一個(gè)串口調(diào)試助手AccessPort递惋,可以提供28800的串口比特率作為測試。