剖析非標準波特率的設定和使用於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<//設定為特訴波特率,比如28800termios.h
>
#include<
sys/ioctl.h
>
#include<
linux
/serial.h
>
struct serial_t ;
int serial_set_speci_baud(struct serial_t *tty,int baud)用法:只要指定serial_t的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;
}
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 ...