當前位置:首頁 » 操作系統 » linux串口讀取數據

linux串口讀取數據

發布時間: 2022-07-30 03:51:08

『壹』 linux怎麼讀取串口數據

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<errno.h>

#defineFALSE-1
#defineTRUE0

intspeed_arr[]={B38400,B19200,B9600,B4800,B2400,B1200,B300,B38400,B19200,B9600,B4800,B2400,B1200,B300,};
intname_arr[]={38400,19200,9600,4800,2400,1200,300,38400,19200,9600,4800,2400,1200,300,};
voidset_speed(intfd,intspeed){
inti;
intstatus;
structtermiosOpt;
tcgetattr(fd,&Opt);
for(i=0;i<sizeof(speed_arr)/sizeof(int);i++){
if(speed==name_arr[i]){
tcflush(fd,TCIOFLUSH);
cfsetispeed(&Opt,speed_arr[i]);
cfsetospeed(&Opt,speed_arr[i]);
status=tcsetattr(fd,TCSANOW,&Opt);
if(status!=0){
perror("tcsetattrfd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}

intset_Parity(intfd,intdatabits,intstopbits,intparity)
{
structtermiosoptions;
if(tcgetattr(fd,&options)!=0){
perror("SetupSerial1");
return(FALSE);
}
options.c_cflag&=~CSIZE;
switch(databits)
{
case7:
options.c_cflag|=CS7;
break;
case8:
options.c_cflag|=CS8;
break;
default:
fprintf(stderr,"Unsupporteddatasize ");return(FALSE);
}
switch(parity)
{
case'n':
case'N':
options.c_cflag&=~PARENB;/*Clearparityenable*/
options.c_iflag&=~INPCK;/*Enableparitychecking*/
break;
case'o':
case'O':
options.c_cflag|=(PARODD|PARENB);
options.c_iflag|=INPCK;/*Disnableparitychecking*/
break;
case'e':
case'E':
options.c_cflag|=PARENB;/*Enableparity*/
options.c_cflag&=~PARODD;
options.c_iflag|=INPCK;/*Disnableparitychecking*/
break;
case'S':
case's':/*asnoparity*/
options.c_cflag&=~PARENB;
options.c_cflag&=~CSTOPB;break;
default:
fprintf(stderr,"Unsupportedparity ");
return(FALSE);
}

switch(stopbits)
{
case1:
options.c_cflag&=~CSTOPB;
break;
case2:
options.c_cflag|=CSTOPB;
break;
default:
fprintf(stderr,"Unsupportedstopbits ");
return(FALSE);
}
/*Setinputparityoption*/
if(parity!='n')
options.c_iflag|=INPCK;
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME]=150;
options.c_cc[VMIN]=0;/*UpdatetheoptionsanddoitNOW*/
if(tcsetattr(fd,TCSANOW,&options)!=0)
{
perror("SetupSerial3");
return(FALSE);
}
return(TRUE);
}

intmain()
{
printf("Thisprogramupdateslasttimeat%s%s ",__TIME__,__DATE__);
printf("STDIOCOM1 ");
intfd;
fd=open("/dev/ttyS0",O_RDWR);
if(fd==-1)
{
perror("serialporterror ");
}
else
{
printf("open");
printf("%s",ttyname(fd));
printf("succesfully ");
}

set_speed(fd,115200);
if(set_Parity(fd,8,1,'N')==FALSE){
printf("SetParityError ");
exit(0);
}
charbuf[]="fe55aa07bc010203040506073d";
write(fd,&buf,26);
charbuff[512];
intnread;
while(1)
{
if((nread=read(fd,buff,512))>0)
{
printf(" Len:%d ",nread);
buff[nread+1]='';
printf("%s",buff);
}
}
close(fd);
return0;
}

『貳』 linux 串口讀取數據被截斷,怎樣一次全部接收

沒辦法保證能夠一次全部接收,只能自己緩存起來處理。比如,發送數據時候增加帶有長度的數據頭以及末尾的校驗,用 select 對串口做非阻塞讀取,讀到數據後檢查是否完整,不完整就接著讀,直到獲得完整數據再處理。

『叄』 linux串口讀取問題

首先你確定你那串口是否有東西可讀? 就是你上面說的「一個文件不停的寫數據到串口」!你可以先不這樣讀取,你可以在終端上用cat試試是否有數據可讀:cat /dev/ttyS0

如果有的話,那你就檢查串口設置是否正確,如波特率,數據位,停止位,校驗位等!

最後就是你讀取的函數了,看看先不要用printf列印字元串了,先看看十六進制是否有,然後再看字元等!

就是以上一些,你還可以參考Linux下串口文檔,網路上很多的……

『肆』 linux怎麼用C程讀取XBee接收到的串口數據

1、接受數據一般是阻塞,就是沒有接收到數據就一直等待,可以設置為不阻塞,這樣就可以了

2、另一種方法是,創建線程,一收、一發,就可以互不影響

『伍』 虛擬機下的linux怎麼接受主機串口接收的數據

虛擬機中的串口連接可以採用兩種方法。一種是指定虛擬機的串口連接到實際的COM上,例如開發機連接到COM1,目標機連接到COM2,然後把兩個串口通過串口線相連接。另一種更為簡便的方法是:在較高一些版本的VMware中都支持把串口映射到命名管道,把兩個虛擬機的串口映射到同一個命名管道。例如,在兩個虛擬機中都選定同一個命名管道 \\.\pipe\com_1,指定target機的COM口為server端,並選擇"The other end is a virtual machine"屬性;指定development機的COM口端為client端,同樣指定COM口的"The other end is a virtual machine"屬性。對於IO mode屬性,在target上選中"Yield CPU on poll"復選擇框,development機不選。

串口是開發者經常要使用到的,我們有些時候需要使用windows開發,然而window裝在了虛擬機中,我們怎麼樣在虛擬機中使用串口呢?
1、在virtualbox中選擇啟用串口,埠模式選擇Host device.
由於現有兩個系統但是只有一個物理串口,所以虛擬機要通過主機的串口文件間接獲取數據,主機是linux,串口設備為/dev/ttyS0
2、埠/文件位置一欄填入:/dev/ttyS0,啟動虛擬機。
3、如果無法啟動虛擬機,很有可能是沒有對ttyS0設備的讀寫許可權,(可以ls -l /dev/ttyS0查看以下許可權)於是我們要修改ttyS0的許可權,在終端中輸入:sudo chmod 777 /dev/ttyS0 這樣就將ttyS0的所有許可權都打開了。啟動虛擬機,這時候就可以在虛擬機中(winXP)使用串口了

『陸』 linux 下,串口讀取很多數據 放到1.txt里

你的這個串口設備在打開(也就是調用open函數獲取設備描述符)的時候設置的是非阻塞方式。導致串口上沒數據的時候read也立即返回,但是你的while已經把有效的數據讀走了,if裡面讀到的一定是空的,所以什麼也不列印。

建議
1. 在打開串口設備時使用阻塞方式,不會設置的話查查open系統調用的幫助,它有個flag;
2. 把while循環內的if語句去掉。

『柒』 Linux中串口read怎樣阻塞的方式讀入數據

Linux中串口read怎樣阻塞的方式讀入數據C/C++ code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

pthread_mutex_lock(&ptty->mt);
ret = read(ptty->fd, pbuf, 1); //由於read並不阻塞 要監聽隨時可能來數據的串口 得不停的循環的查看 效率好低
if(ret < 0)
{
//串口沒有數據進來
}
else
{
//相關處理
}
/*
怎樣加以控制使得,或使用什麼函數
readfunction(ptty->fd, pbuf, ......);//使得這兒沒有串口數據時阻塞,有串口數據了就讀到
//避免不停的循環+sleep() 耗費ARM板資源,而且有時還漏讀
//有的說用什麼fcntl,ioctl 這兩不太懂,希望可以解釋清楚點
*/
pthread_mutex_unlock(&ptty->mt);

熱點內容
matlab遺傳演算法約束 發布:2025-01-18 15:31:33 瀏覽:909
果凍java 發布:2025-01-18 15:25:59 瀏覽:695
電腦與時間伺服器同步間隔 發布:2025-01-18 15:21:28 瀏覽:54
蘋果手機apple登錄密碼在手機哪裡 發布:2025-01-18 15:13:43 瀏覽:380
吃雞去哪裡下手游安卓 發布:2025-01-18 15:10:59 瀏覽:668
東方財富dk指標源碼 發布:2025-01-18 14:45:53 瀏覽:435
陌陌登陸密碼是什麼 發布:2025-01-18 14:36:54 瀏覽:848
海龜編譯器代碼 發布:2025-01-18 14:16:51 瀏覽:34
大閘蟹網站源碼 發布:2025-01-18 14:12:19 瀏覽:105
電腦伺服器日期怎麼改 發布:2025-01-18 14:05:03 瀏覽:687