linux中設置支持非標準波特率614400, 項目中要用到這個波特率,花了幾天,參考了幾個博客,發現資料很少,都大同小異,應用到我的開發板,發現並沒有什麼用。
故閱讀了一下內核代碼,結合其他大神的博客,終於解決了這個特定的波特率問題。現記錄如下,希望對其他人也能有所幫助。
第1步,修改內核代碼支持B614400
相關文件共2個,分別是drivers/tty 目錄下 tty_ioctl.c, include/uapi/asm-generic 目錄下 termbits.h
/////////////////////////////////////////////////////////////修改tty_ioctl.c///////////////////////////////////////////////////////////////////////////
1,打開 __sparc__ 宏定義
#define __sparc__
2, 修改baud_table數組
static const speed_t baud_table[] = {
0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
9600, 19200, 38400, 57600, 115200, 230400, 460800,
#ifdef __sparc__
614400, 921600
#else
500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
2500000, 3000000, 3500000, 4000000
#endif
};
3,修改baud_bits 數組
#ifndef __sparc__
static const tcflag_t baud_bits[] = {
B0, B50, B75, B110, B134, B150, B200, B300, B600,
B1200, B1800, B2400, B4800, B9600, B19200, B38400,
B57600, B115200, B230400, B460800, B500000, B576000,
B921600, B1000000, B1152000, B1500000, B2000000, B2500000,
B3000000, B3500000, B4000000
};
#else
static const tcflag_t baud_bits[] = {
B0, B50, B75, B110, B134, B150, B200, B300, B600,
B1200, B1800, B2400, B4800, B9600, B19200, B38400,
B57600, B115200, B230400, B460800,B614400, B921600
};
#endif
/////////////////////////////////////////////////////////////修改 termbits.h/////////////////////////////////////////////////////////////////////////////////////
需要修改頭文件否則內核編譯不通過.
第2步,修改應用 程序,串口初始化函數.
//設置非標準波特率,
void serial_init_spec(int fd)
{
struct termios options;
tcgetattr(fd, &options); //讀取終端參數
options.c_cflag |= ( CLOCAL | CREAD ); //忽略調試解調器線路狀態,使用接受器
options.c_cflag &= ~CSIZE; //清目前字符長度
options.c_cflag &= ~CRTSCTS; //不實用RTS/CTS控制流
options.c_cflag |= CS8; //字符長度設置爲8
options.c_cflag &= ~CSTOPB; //設置一個標誌位
options.c_iflag |= IGNPAR; //允許輸入奇偶校驗
options.c_iflag &= ~(ICRNL | IXON); //回車不轉換爲換行,不允許輸入時對XON/XOFF>
options.c_oflag = 0;
options.c_lflag = 0;
options.c_cflag |= CBAUDEX; //設置特定波特率的標誌位.
cfsetispeed(&options, B614400); //設置波特率爲614400
cfsetospeed(&options, B614400);
tcsetattr(fd,TCSANOW,&options); //設置終端參數
return;
}
這樣就ok了。 接下來,就可以通過示波器對串口數據進行 監測,查看波特率設置是否正確,每比特位時間大約爲1.627us ,基本就設置成功了。