新聞中心
隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,現(xiàn)在幾乎所有的系統(tǒng)都是基于網(wǎng)絡(luò)的方式進(jìn)行通信的。然而,網(wǎng)絡(luò)并不是唯一的通信方式,還有一種早期的通信方式,那就是串口通信。雖然串口通信在現(xiàn)在已經(jīng)越來越少使用,但是在某些場(chǎng)合下,例如通過串口與外部硬件設(shè)備進(jìn)行通信,還是需要使用到串口。在Linux系統(tǒng)中,我們可以通過命令行和一些特定的工具進(jìn)行串口數(shù)據(jù)的接收和處理。在這篇文章中,我們將介紹如何使用Linux系統(tǒng)接收串口數(shù)據(jù)并對(duì)數(shù)據(jù)進(jìn)行處理。

一、選用正確的串口設(shè)備
在Linux系統(tǒng)中,串口設(shè)備對(duì)應(yīng)著一個(gè)字符設(shè)備文件,例如/dev/ttyS0或/dev/ttyUSB0等。首先我們需要確定串口設(shè)備的名稱,然后才能在程序中打開相應(yīng)的文件進(jìn)行數(shù)據(jù)讀取??梢酝ㄟ^查看/var/log/messages等系統(tǒng)日志文件來確定當(dāng)前系統(tǒng)中存在的串口設(shè)備,并且在查看設(shè)備時(shí)需要記住串口設(shè)備號(hào),以便后面程序中打開相應(yīng)文件。
二、使用stty設(shè)置串口參數(shù)
在打開串口設(shè)備文件之前,我們需要通過stty工具對(duì)串口設(shè)備進(jìn)行配置。stty工具可以進(jìn)行串口設(shè)備的設(shè)定,包括串口設(shè)備的波特率、校驗(yàn)位、停止位等各種參數(shù)的設(shè)置。例如以下命令設(shè)置串口設(shè)備的波特率:
stty -F /dev/ttyS0 9600
這將把設(shè)備ttyS0的波特率設(shè)置為9600。
三、使用read函數(shù)讀取串口數(shù)據(jù)
在串口設(shè)備成功打開之后,我們可以使用read函數(shù)讀取串口傳輸?shù)臄?shù)據(jù)。read函數(shù)是一種從文件描述符讀取數(shù)據(jù)的函數(shù),其參數(shù)為設(shè)備文件的描述符,緩沖區(qū)指針和緩沖區(qū)大小。在讀取數(shù)據(jù)時(shí),如果無法立即得到數(shù)據(jù),函數(shù)將進(jìn)入阻塞狀態(tài),直到有數(shù)據(jù)到來。例如以下代碼段可以讀取從串口設(shè)備中傳輸?shù)臄?shù)據(jù):
#include
#include
#include
#include
int mn()
{
int fd;
fd=open(“/dev/ttyS0”,O_RDON | O_NOCTTY | O_NDELAY);
if(fd==-1)
{
printf(“Fled to open device.\n”);
return -1;
}
struct termios options;
tcgetattr(fd,&options);
cfsetispeed(&options,B9600);
tcsetattr(fd,TCSANOW,&options);
char buf[255];
int nbytes=read(fd,buf,sizeof(buf));
if(nbytes
{
printf(“Read fled.\n”);
return -1;
}
else
{
printf(“Received %d bytes:%s\n”,nbytes,buf);
return 0;
}
}
四、處理串口數(shù)據(jù)
在成功接收到串口傳輸?shù)臄?shù)據(jù)之后,我們可以對(duì)數(shù)據(jù)進(jìn)行處理。數(shù)據(jù)處理的方法取決于數(shù)據(jù)的具體形式和格式。在通用的情況下,我們可以使用字符串的處理函數(shù)來處理數(shù)據(jù)。例如,如果我們需要查找字符串中的特定字符,我們可以使用strchr函數(shù)。如果我們需要將字符串轉(zhuǎn)換為整數(shù),則可以使用atoi函數(shù)。以下是一個(gè)使用strchr函數(shù)提取串口傳輸數(shù)據(jù)中的感嘆號(hào)“!”的代碼示例:
#include
#include
#include
#include
#include
#include
#include
int mn()
{
int fd;
fd=open(“/dev/ttyS0”,O_RDON | O_NOCTTY | O_NDELAY);
if(fd==-1)
{
printf(“Fled to open device.\n”);
return -1;
}
struct termios options;
tcgetattr(fd,&options);
cfsetispeed(&options,B9600);
tcsetattr(fd,TCSANOW,&options);
char buf[255];
int nbytes=read(fd,buf,sizeof(buf));
if(nbytes
{
printf(“Read fled.\n”);
return -1;
}
else
{
printf(“Received %d bytes:%s\n”,nbytes,buf);
char *p=strchr(buf,’!’);
if(p!=NULL)
{
printf(“Found exclamation point!\n”);
}
return 0;
}
}
相關(guān)問題拓展閱讀:
- 各位大俠,我寫了一個(gè)linux下我寫了個(gè)程序驗(yàn)證串口接收數(shù)據(jù)情況,是個(gè)死循環(huán)read,發(fā)現(xiàn)串口需要分多次read
各位大俠,我寫了一個(gè)linux下我寫了個(gè)程序驗(yàn)證串口接收數(shù)據(jù)情況,是個(gè)死循環(huán)read,發(fā)現(xiàn)串口需要分多次read
首先,默認(rèn)的串口文件的緩存方式型猜是無緩沖。其次,串口在發(fā)送數(shù)據(jù)的時(shí)候不是連續(xù)的。
比如,串口要給你0x62,0x77。那么他就先發(fā)0x62后發(fā)0x77。而如果你在他發(fā)完0x62的時(shí)候馬上就read()那就會(huì)只得到0x62.而0x77要再read一次。
如果你想一次就全讀上來,那有兩個(gè)方法。宴兄
1:你自己寫一個(gè)讀串口的函數(shù),里面調(diào)用read;
例如:
int tipc_read_socket( int sockfd, char *buf, int len )
{
int count = 0; //每次讀取字節(jié)數(shù)
int pos = 0; //總共讀取字節(jié)數(shù)
pos = 0;
do {
count = read(sockfd, &buf, len – pos);
//printf(“tipc_read_socket:count\n”, count);
if( 0 > count )
{
if( EINTR == errno )
continue;
//當(dāng)設(shè)置為non block的時(shí)候,之一次把所有的數(shù)晌租襲據(jù)讀取完以后,第二次的結(jié)果為-1.
return( pos );
}
if( 0 == count ) break; /* Nothing left! */
pos += count;
} while( len > pos );
return( pos );}
2:你設(shè)置一下輸入輸出屬性。
struct termios newtio;
bzero( &newtio, sizeof( newtio ) );
newtio.c_cc = ***;
newtio.c_cc = ***;
tcsetattr(fd,TCSANOW,&newtio);
這個(gè)里面的VTIME,VMIN。就是讀等待的時(shí)間。
設(shè)置了以后,比如你讀0x62的時(shí)候read,那么他會(huì)等待你設(shè)置的時(shí)間,如果在這個(gè)時(shí)間里面0x77來了,那他會(huì)把0x62和0x77一起返回給你。這個(gè)時(shí)間跟波特率有關(guān),應(yīng)該是設(shè)置為在某種波特率的情況下連續(xù)兩字節(jié)的更大間隔時(shí)間。
將串口打開模式設(shè)為非阻塞模式,用多線程實(shí)現(xiàn).
你read給的參數(shù)是什么?
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)成都老牌IDC服務(wù)商,專注四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,可選線路電信、移動(dòng)、聯(lián)通等。
當(dāng)前標(biāo)題:Linux串口數(shù)據(jù)接收妙招,完美處理數(shù)據(jù)(linux串口接收處理)
當(dāng)前地址:http://m.fisionsoft.com.cn/article/cdscjid.html


咨詢
建站咨詢
