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

linux串口讀取

發布時間: 2023-02-22 07:01:59

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信息,以字元$開始,以字元 結尾。

你的代碼問題處在對結尾的判斷上。

每次讀到數據後,首先應該放入一個緩沖區的後面。之後從緩沖區的第一個位元組開始掃描,找到一對$和 ,然後列印該信息,並將後面的內容拷貝到前面。


讀串口的誤區:

  1. 讀出來的信息是完整的。 串口的信息只是代表當時有多少數據,不保證數據是幀對其的。

  2. 即使第一次讀到了$,不代表第二次讀到的恰好是末尾的字元串。有可能更長(包含下一條信息的一部分)或者更短。

❹ 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]='';
printf("%s",buff);
}
}
close(fd);
return0;
}

❼ linux 串口讀取數據, if((nread = read(fd, buf_rev, 256))>0) {列印buf_rev;}

由接收方緩沖區大小決定吧。你要連續讀,然後放到一個緩沖區里,再用其它函數讀緩沖區。

❽ linux 從串口讀取數據時出現Segmentation fault

printf("the received words are :%s",buff[i]);
這句不對,buff[i]為一個字元或者是整數,與%s匹配,會造成訪問地址為buff[i]的內存,致使發生段錯誤,改為:
printf("the received words are :%c",buff[i]); 或者:
printf("the received words are :%s",&buff[i]);

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:593
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:888
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:581
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:765
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:684
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1012
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:255
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:113
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:806
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:712