加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

嵌入式 | LINUX的串口非標(biāo)準(zhǔn)波特率更改

2022/08/01
958
閱讀需 4 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

LINUX的庫(kù)提供的波特率是標(biāo)準(zhǔn)波特率,應(yīng)用時(shí)有時(shí)會(huì)用到非標(biāo)準(zhǔn)的波特率。以下試驗(yàn)使用的xilinx的zynq7020,linux內(nèi)核是4.14版本。以增加波特率100k為例??戳艘恍┲苯釉趹?yīng)用端改的一些方法,已經(jīng)取消了,所以更改了內(nèi)核

第一步,內(nèi)核需要更改兩個(gè)地方,一是/drivers/tty/tty_baudrate.c,另一個(gè)是/include/uapi/asm-generic/termbits.h

先看第二個(gè),這個(gè)CBAUD原來(lái)是0010017改為0030017,見(jiàn)圖1,是用來(lái)做掩碼計(jì)算的。

圖1

 

這兩個(gè)是新加的,如圖2

圖2

 

這個(gè)頭文件一共更改這三個(gè)地方。先說(shuō)為什么增加波特率使用0020001而不在B4000000后面遞增使用0010020,這是因?yàn)檫@個(gè)低位的20已經(jīng)被占用了,如下圖3,所以找了沒(méi)被占用的位置,0020000的中2這個(gè)bit位置在c_cflag中沒(méi)被占用(c_cflag是用于設(shè)置波特率和其他一些信息的)。第一處的0030017也是這個(gè)原因,就是將波特率即可使用的這些宏定義包含進(jìn)去。

圖3

 

第二步,更改文件/drivers/tty/tty_baudrate.c,這個(gè)文件就是獲取波特率具體數(shù)值的文件,應(yīng)用端的數(shù)據(jù)傳入到內(nèi)核,內(nèi)核解析并獲得100k波特率這個(gè)數(shù)值就是在這個(gè)文件,

先在文件頭部的波特率列表中增加所需數(shù)值,如圖4,其中的100000和B100000為新增加。

圖4

 

修改函數(shù)speed_t tty_termios_baud_rate(struct ktermios *termios),圖5

圖5

 

其中圈起來(lái)的地方是新加的,這就是根據(jù)剛才新加的部分進(jìn)行波特率修改,新的0020001,與CBAUDEX2進(jìn)行運(yùn)算判斷高位位置,之所以cbaud+=30是因?yàn)榍懊嬉呀?jīng)有了30個(gè)波特率了,見(jiàn)圖5。這樣內(nèi)核就修改完了。

第三步,應(yīng)用端的配置,應(yīng)用端通常使用tcsetattr這個(gè)函數(shù)進(jìn)行配置,在使能之前,對(duì)齊c_cflag進(jìn)行賦值就可

struct termios , termios_new;

termios_new.c_cflag |= 0020001;

(其余配置省略)

tcsetattr(fdcom, TCSANOW, &termios_new);

這樣串口波特率即更改為100k,如需其他波特率在頭文件處增加,應(yīng)用端賦值對(duì)應(yīng)數(shù)值即可。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜