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

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

嵌入式 | LINUX的串口非標準波特率更改

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

LINUX的庫提供的波特率是標準波特率,應用時有時會用到非標準的波特率。以下試驗使用的xilinx的zynq7020,linux內(nèi)核是4.14版本。以增加波特率100k為例??戳艘恍┲苯釉趹枚烁牡囊恍┓椒?,已經(jīng)取消了,所以更改了內(nèi)核

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

先看第二個,這個CBAUD原來是0010017改為0030017,見圖1,是用來做掩碼計算的。

圖1

 

這兩個是新加的,如圖2

圖2

 

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

圖3

 

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

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

圖4

 

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

圖5

 

其中圈起來的地方是新加的,這就是根據(jù)剛才新加的部分進行波特率修改,新的0020001,與CBAUDEX2進行運算判斷高位位置,之所以cbaud+=30是因為前面已經(jīng)有了30個波特率了,見圖5。這樣內(nèi)核就修改完了。

第三步,應用端的配置,應用端通常使用tcsetattr這個函數(shù)進行配置,在使能之前,對齊c_cflag進行賦值就可

struct termios , termios_new;

termios_new.c_cflag |= 0020001;

(其余配置省略)

tcsetattr(fdcom, TCSANOW, &termios_new);

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

相關推薦

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