新聞中心
串口linux開發(fā)實(shí)踐分享

在湛江等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作 網(wǎng)站設(shè)計制作按需定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營銷型網(wǎng)站,成都外貿(mào)網(wǎng)站建設(shè)公司,湛江網(wǎng)站建設(shè)費(fèi)用合理。
隨著科技的發(fā)展,串口通信的應(yīng)用越來越廣泛,特別是在工業(yè)自動化、智能家居、電子產(chǎn)品等領(lǐng)域。串口通信的開發(fā)工作需要在Linux系統(tǒng)下進(jìn)行,但是Linux系統(tǒng)上各種開發(fā)環(huán)境繁多,如何選擇合適的工具和方法進(jìn)行開發(fā),是開發(fā)人員需要考慮的重要問題。本文將分享我在串口Linux開發(fā)實(shí)踐中的經(jīng)驗(yàn)和心得。
1、串口概述
串口是計算機(jī)和外部設(shè)備之間進(jìn)行通信的一種方式。串口通信可以使用RS-232、RS-485、USB等不同的協(xié)議。串口通信具有數(shù)據(jù)傳輸速度慢、傳輸距離短、信息傳輸穩(wěn)定可靠等特點(diǎn),因此被廣泛應(yīng)用。
2、串口Linux開發(fā)環(huán)境搭建
2.1 嵌入式Linux開發(fā)環(huán)境
需要開發(fā)嵌入式Linux系統(tǒng),選擇適合的開發(fā)環(huán)境非常重要。嵌入式Linux主要集成了Linux內(nèi)核、文件系統(tǒng)、libc等組件。這里我們推薦使用OpenWrt開源操作系統(tǒng),其特點(diǎn)是小巧、靈活、易于定制,可運(yùn)行于各種嵌入式設(shè)備上。使用OpenWrt開發(fā)和調(diào)試串口應(yīng)用非常方便。
2.2 Linux深度開發(fā)環(huán)境
如果開發(fā)應(yīng)用層的串口程序,我們推薦使用廣泛應(yīng)用的編譯器gcc和調(diào)試工具gdb。這些工具支持C、C++等多種編程語言,并能夠很好地支持Linux操作系統(tǒng)。另外,如有需要也可以選擇Qt Creator、Eclipse等綜合性開發(fā)環(huán)境。
3、串口Linux開發(fā)實(shí)踐
3.1 串口開發(fā)基礎(chǔ)
在進(jìn)行串口開發(fā)之前,我們需要掌握以下幾個基本知識:
(1)Linux系統(tǒng)中串口設(shè)備文件的命名規(guī)則為“/dev/tty*”。
(2)需要使用“open”函數(shù)打開串口設(shè)備,使用“read”和“write”函數(shù)實(shí)現(xiàn)串口讀寫。
(3)通過“ioctl”函數(shù)設(shè)置串口參數(shù),如波特率、數(shù)據(jù)位、奇偶校驗(yàn)位等。
3.2 串口開發(fā)實(shí)例
下面我們以一個簡單的串口通信程序?yàn)槔齺碚f明如何進(jìn)行串口開發(fā)。
#include
#include
#include
#include
#include
#include
int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio, oldtio;
if ( tcgetattr( fd, &oldtio ) != 0 )
{
perror(“tcgetattr”);
return -1;
}
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
switch ( nBits )
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}
switch ( nEvent )
{
case ‘O’:
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= ( INPCK | ISTRIP );
break;
case ‘E’:
newtio.c_iflag |= ( INPCK | ISTRIP );
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case ‘N’:
newtio.c_cflag &= ~PARENB;
break;
}
switch ( nSpeed )
{
case 2400:
cfsetispeed( &newtio, B2400 );
cfsetospeed( &newtio, B2400 );
break;
case 4800:
cfsetispeed( &newtio, B4800 );
cfsetospeed( &newtio, B4800 );
break;
case 9600:
cfsetispeed( &newtio, B9600 );
cfsetospeed( &newtio, B9600 );
break;
case 115200:
cfsetispeed( &newtio, B115200 );
cfsetospeed( &newtio, B115200 );
break;
default:
cfsetispeed( &newtio, B9600 );
cfsetospeed( &newtio, B9600 );
break;
}
if ( nStop == 1 )
{
newtio.c_cflag &= ~CSTOPB;
}
else if ( nStop == 2 )
{
newtio.c_cflag |= CSTOPB;
}
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
tcflush( fd, TCIFLUSH );
if ( tcsetattr( fd, TCSANOW, &newtio ) != 0 )
{
perror(“tcsetattr”);
return -1;
}
return 0;
}
int mn(void)
{
int fd;
int nread;
char buf[1024] = {0};
fd = open(“/dev/ttyAMA0”,O_RDWR);
if(fd == -1 )
{
perror(“open”);
return -1;
}
set_opt(fd, 115200, 8, ‘N’, 1);
while(1)
{
nread = read(fd, buf, 1024);
if(nread > 0)
{
printf(“recv:%s\n”, buf);
}
}
close(fd);
return 0;
}
這段程序?qū)崿F(xiàn)了打開串口設(shè)備“/dev/ttyAMA0”并設(shè)置波特率為115200、數(shù)據(jù)位為8、無奇偶校驗(yàn)位、停止位為1。然后讀取串口發(fā)送的數(shù)據(jù),并在終端上輸出。
4、
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù)!
Linux串口調(diào)試工具–minicom
安裝完成后,請氏神不要著急打開軟件。需先進(jìn)行配置。具體步驟如下:
查看串口設(shè)備及文件權(quán)限
linux下的所有操作面向用戶的都是文件操作,在對串口操作之前,我們應(yīng)該先確認(rèn)自己對該文件有沒有讀寫權(quán)限。
linux下的u串口命名為ttyUSB*,運(yùn)行上面命令,可以看到有幾個設(shè)備掛載。
我們這里是:
只有ttuUSB0.再用lsu查看:
u 004正是我們掛上去的u轉(zhuǎn)串口線纜,使用的芯片是PL2303。
但是正如上面顯示,ttyUSB0這個設(shè)備是root所有的,所以,我們以普通用戶身份打開minicom是沒法訪問該文件的。
運(yùn)行sudo minicom -s便進(jìn)入了minicom的配置界面,使用上下鍵選擇Serial port setup,回車。此時光標(biāo)在“change which setting”后面停留,它的上面有如下菜單:
我們只需輸入上面對穗核哪應(yīng)的字母,就可以進(jìn)如相應(yīng)的菜單進(jìn)行設(shè)置。設(shè)置完成,回車,光標(biāo)會回到“change which setting”后面,如此重復(fù)。完成按回車返回主菜單即可。
返回主菜單后,選擇“Save setup as df1”,將其保存為默認(rèn)設(shè)置,然后選擇 Exit退出。需退出后重新打開minicom,軟件才會使用上述參數(shù)進(jìn)行初始化。
注意:如果沒有使用USB轉(zhuǎn)串口,而是直接使用串口,那么Serial Device要配置為/dev/ttyS0。
如果上面設(shè)置順利,打開minicom
重新給設(shè)備上電后,此時,窗口里就有信息打印出來了。
1)需使用Ctrl+a 進(jìn)入設(shè)置狀態(tài)
2)按z進(jìn)入設(shè)置菜單
(1)O鍵:打開配置選項(xiàng);
(2)W鍵:自動卷屏。當(dāng)顯示的內(nèi)容超過一行之後,自動將後面的內(nèi)容換行。這個功能在查看內(nèi)核的啟動信息時很有用。
(3)C鍵:清除屏幕的顯示內(nèi)容;
(4)B鍵:瀏覽minicom的歷史顯示;
(5)X鍵:退出minicom,會提示確認(rèn)退出。
Ctrl + A –> O
選擇”Filenames and paths”
更多的參數(shù),參見”man minicom”的輸出。
如果不加這個項(xiàng),那么在minicom和pc交互的時候中鍵入命令超過一行時候會被截斷,(這時候可以通過 w 來開和關(guān)切換截斷行功能).
這樣,啟動之后我們會發(fā)現(xiàn)顯示的內(nèi)容不是黑白的了。
這樣,啟動之后,所在minicom的輸出都會在中保留一份,如果原來文件存在,則追加,不存在猜碼則創(chuàng)建一個。
這樣,我們可以取代用 * 發(fā)送命令的方式,將 替換成 或者 .
這里,是你的腳本文件的名字,應(yīng)該指定絕對路徑,否則就會在你啟動minicom的路徑下尋找。
Minicom是基于窗口的。要彈出所需功能的窗口,可按下 Ctrl-A (以下使用C-A來表示Ctrl-A),然后再按各功能鍵(a-z或A-Z)。先按C-A,再按’z’,將出現(xiàn)一個幫助窗口,提供了所有命令的簡述。配置 minicom(-s 選項(xiàng),或者C-A、O)時,可以改變這個轉(zhuǎn)義鍵,不過現(xiàn)在我們還是用Ctrl-A吧。
這里,只給出很少的命令,更多的交互命令參見” z”的幫助輸出。
minicom -s 或啟動minicom之后運(yùn)行 o 來進(jìn)行配置。
C:腳本文件的存放位置: g 運(yùn)行腳本時的路徑 。
D:選擇腳本程序: 默認(rèn) runscript ,也可以選擇 bash 腳本格式。
可以參考man手冊 man runscript .交互命令中可以運(yùn)行” G “來運(yùn)行腳本。
參考資料
Linux下串口通信丟字節(jié)的問題是怎么樣解決
int con=atoi(portstr);
unsigned char Port_file_name;
int fd0,rc;
struct termios ts0;
switch (con)
{ //選項(xiàng)O_NOCTTY 表示不能把本串口當(dāng)成控制終端,否則用戶的鍵盤輸入信息將影響程序的執(zhí)行
//O_NDELAY表示瞎判打開串口的時候,程序并不關(guān)心另一端悔則的串口是否在使用中
case 1: fd0=open(“/dev/ttyM0”,O_RDWR | O_NOCTTY | O_NDELAY); break;
case 2: fd0=open(“/dev/ttyM1”,O_RDWR | O_NOCTTY | O_NDELAY); break;
case 3: fd0=open(“/dev/ttyM2”,O_RDWR | O_NOCTTY | O_NDELAY); break;
case 4: fd0=open(“/dev/ttyM3”,O_RDWR | O_NOCTTY | O_NDELAY); break;
case 5: fd0=open(“/dev/ttyM4”,O_RDWR | O_NOCTTY | O_NDELAY); break;
case 6: fd0=open(“/dev/ttyM5”,O_RDWR | O_NOCTTY | O_NDELAY); break;
case 7: fd0=open(“/dev/ttyM6”,O_RDWR | O_NOCTTY | O_NDELAY); break;
case 8: fd0=open(“/dev/ttyM7”,O_RDWR | O_NOCTTY | O_NDELAY); break;
default : fd0=open(“/dev/ttyM0”,O_RDWR | O_NOCTTY | O_NDELAY); break;
}
tcgetattr(fd0,&ts0);
bzero(&ts0,sizeof(struct termios));
switch (gytype)
{
case 1:{ts0.c_cflag |= B300 | CS7 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; // 轉(zhuǎn)換為偶效驗(yàn)
ts0.c_iflag |= INPCK; // Disnable parity checking
break; }
case 2:{ts0.c_cflag |= B1200 | CS8 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; //磨前改 轉(zhuǎn)換為偶效驗(yàn)
ts0.c_iflag |= INPCK; // Disnable parity checking
break;
}
case 3:{
ts0.c_cflag |= B9600 | CS8 | CLOCAL | CREAD ;
ts0.c_cflag &= ~PARENB; // Clear parity enable
ts0.c_iflag &= ~INPCK; // Enable parity checking
break;
}
case 4:{ts0.c_cflag |= B9600 | CS8 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; // 轉(zhuǎn)換為偶效驗(yàn)
ts0.c_iflag |= INPCK; // Disnable parity checking
break;
}
}
ts0.c_lflag &= ~ECHO;
ts0.c_lflag &= ~ECHONL;
ts0.c_iflag &= ~IXOFF;
ts0.c_iflag &= ~IXON;
ts0.c_cflag &= ~CSIZE;
switch (gytype)
{
case 1:{ts0.c_cflag |= CS7 ; break;}
case 2:{ts0.c_cflag |= CS8 ; break;}
case 3:{ts0.c_cflag |= CS8 ; break;}
case 4:{ts0.c_cflag |= CS8 ; break;}
}
ts0.c_lflag &= ~ICANON; //如果設(shè)置使能規(guī)范輸入,否則使用原始數(shù)據(jù)(本文使用)
ts0.c_oflag &= ~ONLCR; //如果設(shè)置將NL轉(zhuǎn)換成CR-NL后輸出
ts0.c_iflag &= ~INLCR; //如果設(shè)置將接收到的NL(換行)轉(zhuǎn)換成CR(回車)。
ts0.c_cc = 0; //最少可讀數(shù)據(jù)
ts0.c_cc = 0; //等待數(shù)據(jù)時間(10秒的倍數(shù))
ts0.c_cflag &= ~CSTOPB; //如果設(shè)置則使用兩個停止位 ,如果取消則使用一個停止位
ts0.c_iflag |= IGNBRK; //如果設(shè)置則忽略接收到的break信號
ts0.c_lflag &= ~IEXTEN; //如果設(shè)置則啟用實(shí)現(xiàn)自定義的輸入處理
ts0.c_lflag |= NOFLSH; //如果設(shè)置則禁止產(chǎn)生SIGINT,SIGQUIT和SIGSUSP信號時刷新輸入和輸出隊(duì)列
switch (gytype)
{
case 1:{rc = cfsetospeed(&ts0,B300);break; }
case 2:{rc = cfsetospeed(&ts0,B1200);break; }
case 3:{rc = cfsetospeed(&ts0,B9600);break; }
case 4:{rc = cfsetospeed(&ts0,B9600);break; }
}
rc = tcsetattr(fd0,TCSAFLUSH,&ts0);
串口linux的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于串口linux,串口linux開發(fā)實(shí)踐分享,Linux串口調(diào)試工具–minicom,Linux下串口通信丟字節(jié)的問題是怎么樣解決的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡稱香港主機(jī)/香港空間。香港虛擬主機(jī)特點(diǎn)是免備案空間開通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問快、穩(wěn)定!
當(dāng)前標(biāo)題:串口linux開發(fā)實(shí)踐分享(串口linux)
當(dāng)前網(wǎng)址:http://fisionsoft.com.cn/article/cospsdp.html


咨詢
建站咨詢
