剖析非標準波特率的設定和使用於Linux作業系統中

2021-06-26 17:07:58 字數 1820 閱讀 4093

剖析非標準波特率的設定和使用於linux作業系統中 - 51cto.com

linux作業系統最近幾年的發展超過了微軟的想象,大有趕上微軟的趨勢,於是也就有大部分人開始學習linux作業系統,通常,在linux下面,設定串列埠使用終端io的相關函式設定,如tcsetattr等函式。

linux作業系統最近幾年的發展超過了微軟的想象,大有趕上微軟的趨勢,於是也就有大部分人開始學習linux作業系統,通常,在linux下面,設定串列埠使用終端io的相關函式設定,如tcsetattr等函式,linux內部有乙個對常用波特率列表的索引,根據設定的波特率用底層驅動來設定非同步通訊晶元的暫存器

對於非標準的任意波特率需要用ioctl(fd, tiocgserial, p)和ioctl(fd, tiocsserial, p)的配合,ioctl的最後乙個引數是struct serial_struct *型別,在linux/serial.h中定義。其中baud_base是基準晶振頻率/16,通常是115200,你需要設的是custom_divisor這個值,最終的波特率為baud_base/custom_divisor,比如你需要28800,因為115200/4=28800,所以要設定custom_divisor=4,。

具體過程為,先設定波特率設為38400(tcsetattr),然後用tiocgserial得到當前的設定,將flags設定async_spd_cust位,設定custom_divisor,最後用tiocsserial設定。

使用setserial其實就是利用上述方法,來設定baud_base, custom_divisor等, 其內部實現就是使用ioctl來進行設定,

另外還可以用硬體更換晶振,根據比例來達到使用一些非標準的波特率的目的.

參考:

#include<

termios.h

>

#include<

sys/ioctl.h

>

#include<

linux

/serial.h

>

struct serial_t ; 

//設定為特訴波特率,比如28800

int serial_set_speci_baud(struct serial_t *tty,int baud)  

ss.flags

= async_spd_cust

;  ss

ss.custom_divisor

= ss.baud_base / baud;  

if((ioctl(tty-

>

fd,tiocsserial,&ss))<

0)  

ioctl(tty-

>

fd,tiocgserial,&ss_set);  

dprintk("baud: success set baud to %d,

custom_divisor

=%d,

baud_base

=%d\n",  

baud,ss_set.custom_divisor,ss_set.baud_base);  

return 0;  

}

用法:只要指定serial_t的baud就可以了

static struct serial_t __seri_conf = ,  

};

以上就linux作業系統下非標準波特率的設定和使用。

imx6 配置串列埠波特率 串列埠非標準波特率除錯

首先我用板子是imx6dl的,然後執行的系統是linux,我這裡要除錯出乙個串列埠,波特率在256000,遇到問題是在對應的應用程式標頭檔案裡面並沒有定義這個波特率,現在也不知道該怎麼新增?現在除錯的波特率只能到115200,在它裡面的有的230400都不能除錯成功,不知道是 問題?求大神指導!這個...

linux中串列埠如何支援非標準波特率B28800?

參考 http blog.ednchina.com seam liu 7181 post.aspx include include include struct serial t 設定為特訴波特率,比如28800 int serial set speci baud struct serial t t...

程式設定波特率和串列埠除錯助手波特率設定不同才能通訊

本人小白乙個,在根據教程去做串列埠通訊時,程式碼完之後,除錯助手一直顯示亂碼。網路上查詢原因,得知是波特率不對,當串列埠的波特率是38400,程式上是115200時,串列埠才開始正常通訊 原因 把stm32f4xx.h中的hse value 設根據外部實際晶振的標稱值進行更改。if defined ...