linux串口讀取
❶ linux串口收到數據和windows串口收到的不一樣
你好,中文亂碼的話,注意接收後可能需要編碼轉換,比如GB2312,utf8,unicode這幾種編碼格式的轉換
如果不是中文的話,可以按照下面方式進行檢查
1、具體檢查方法,將linux中的發送和接受進行短接(就是將發送和接受連起來),看看接受的數據是否相同。
這一步中,因為使用的是同一個串口,所以串口的設置一定是相同的。這樣如果都收不正確,可以確定是linux串口驅動的問題。
2、詳細設置linux串口的參數,包括波特率,校驗,串口位數。將linux和單片機設置相同,看看接受數據是否相同
如果還是不相同。
3、在windows中使用串口調試助手設置同單片機串口相同的參數,查看接受數據是否正確。
如果不正確,說明是單片機串口參數設置的問題,或者是時鍾頻率的問題。
如果正確,說明一定是linux端的問題。
如果是linux端的問題,主要從兩個方面解決,一個是參數設置,一個是信息讀取。下面是測試方法。
4linux端查看一下代碼設置。利用驅動介面,讀出串口的參數,看看和你程序中設置的參數是否相同,如果不相同說明設置參數的代碼沒寫對。
5如果參數設置是正確的,那麼直接cat 驅動的位置,可以直接讀出串口的數據,此時讀取的數據應該是和發送端一樣的,如若不一樣。。。。那麼基本就是linux時鍾的問題導致的了。若linux是PC上的一般不會出現時鍾設置錯誤,如果linux是嵌入式上的話,你看看時鍾配置是否正確吧
❷ linux串口讀取問題
首先你確定你那串口是否有東西可讀? 就是你上面說的「一個文件不停的寫數據到串口」!你可以先不這樣讀取,你可以在終端上用cat試試是否有數據可讀:cat /dev/ttyS0
如果有的話,那你就檢查串口設置是否正確,如波特率,數據位,停止位,校驗位等!
最後就是你讀取的函數了,看看先不要用printf列印字元串了,先看看十六進制是否有,然後再看字元等!
就是以上一些,你還可以參考Linux下串口文檔,網路上很多的……
❸ linux 串口每次讀取8位
gps信息,以字元$開始,以字元 結尾。
你的代碼問題處在對結尾的判斷上。
每次讀到數據後,首先應該放入一個緩沖區的後面。之後從緩沖區的第一個位元組開始掃描,找到一對$和 ,然後列印該信息,並將後面的內容拷貝到前面。
讀串口的誤區:
讀出來的信息是完整的。 串口的信息只是代表當時有多少數據,不保證數據是幀對其的。
即使第一次讀到了$,不代表第二次讀到的恰好是末尾的字元串。有可能更長(包含下一條信息的一部分)或者更短。
❹ Linux串口讀二進制文件讀不完整,而.c和.txt文件都可以正常從串口讀取
檢查串口的工作模式。
我記得串列有一種 7bit 的傳輸模式,這個模式下,只能傳輸 7bit 的數據,對應的就是 ASCII 文本,二進制傳輸都會出問題。
其實,你也可以完全不考慮傳輸模式的問題。發送數據時,用 base64 編碼,收到數據後再解碼就 OK 了。這樣 base64 數據完全都是 7bit 的。
❺ linux 串口讀取數據被截斷,怎樣一次全部接收
沒辦法保證能夠一次全部接收,只能自己緩存起來處理。比如,發送數據時候增加帶有長度的數據頭以及末尾的校驗,用 select 對串口做非阻塞讀取,讀到數據後檢查是否完整,不完整就接著讀,直到獲得完整數據再處理。
❻ 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]='
