Linux系統串列埠接收資料編

2022-04-04 01:27:59 字數 4900 閱讀 3287

之前基於ibm deveplopworks社群的**,做了串列埠初始化和傳送的程式,今天在此基礎上新增了讀取串列埠資料的程式。首先是最簡單的迴圈讀取程式,第二個是通過軟中斷方式,使用訊號signal機制讀取串列埠,這裡需要注意的是硬體中斷是裝置驅動層級的,而讀寫串列埠是使用者級行為,只能通過訊號機制模擬中斷,訊號機制的發生和處理其實於硬體中斷無異,第三個是通過select系統呼叫,在沒有資料時阻塞程序,串列埠有資料需要讀時喚醒程序。第二個和第三個例子都能用來後台讀取資料,值得學習。

**一:迴圈讀取資料

[cpp]view plain

copy

#include

#include

#include

#include

#include

#include

#include

#include

#define false -1

#define true 0

intspeed_arr = ;  

intname_arr = ;  

void

set_speed(

intfd, 

intspeed)      

tcflush(fd,tcioflush);     

}    

}  }  

intset_parity(

intfd,

intdatabits,

intstopbits,

intparity)  

options.c_cflag &= ~csize;   

switch

(databits)   

switch

(parity)   

switch

(stopbits)  

/* set input parity option */

if(parity != 

'n')     

options.c_iflag |= inpck;   

tcflush(fd,tciflush);  

options.c_cc[vtime] = 150;   

options.c_cc[vmin] = 0; /* update the options and do it now */

if(tcsetattr(fd,tcsanow,&options) != 0)     

return

(true);    

}  int

main()  

else

set_speed(fd,115200);  

if(set_parity(fd,8,1,

'n') == false)    

char

buf = 

"fe55aa07bc010203040506073d"

;  write(fd,&buf,26);  

char

buff[512];   

intnread;    

while

(1)  

}  close(fd);  

return

0;  

}  **清單二:通過signal機制讀取資料

[cpp]view plain

copy

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define false -1

#define true 0

#define flag 1

#define noflag 0

intwait_flag = noflag;  

intstop = 0;  

intres;  

intspeed_arr =  

;  int

name_arr =  

;  void

set_speed (int

fd, 

intspeed)  

tcflush (fd, tcioflush);  

}  }  

}  int

set_parity (int

fd, 

intdatabits, 

intstopbits, 

intparity)  

options.c_cflag &= ~csize;  

switch

(databits)  

switch

(parity)  

switch

(stopbits)  

/* set input parity option */

if(parity != 

'n')  

options.c_iflag |= inpck;  

tcflush (fd, tciflush);  

options.c_cc[vtime] = 150;  

options.c_cc[vmin] = 0;   /* update the options and do it now */

if(tcsetattr (fd, tcsanow, &options) != 0)  

return

(true);  

}  void

signal_handler_io (int

status)  

intmain ()  

else

saio.sa_handler = signal_handler_io;  

sigemptyset (&saio.sa_mask);  

saio.sa_flags = 0;  

saio.sa_restorer = null;  

sigaction (sigio, &saio, null);  

//allow the process to receive sigio

fcntl (fd, f_setown, getpid ());  

//make the file descriptor asynchronous

fcntl (fd, f_setfl, fasync);  

set_speed (fd, 115200);  

if(set_parity (fd, 8, 1, 

'n') == false)  

char

buf[255];  

while

(stop == 0)  

}  close (fd);  

return

0;  

}  **三:通過select系統呼叫進行io多路切換,實現非同步讀取串列埠資料

[python]view plain

copy

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define false -1

#define true 0

#define flag 1

#define noflag 0

int wait_flag = noflag;  

int stop = 0

;  int res;  

int speed_arr =  

;  int name_arr =  

;  void  

set_speed (int fd, int speed)  

tcflush (fd, tcioflush);  

}  }  

}  int  

set_parity (int fd, int databits, int stopbits, int parity)  

options.c_cflag &= ~csize;  

switch (databits)  

switch (parity)  

switch (stopbits)  

/* set input parity option */  

if(parity != 

'n')  

options.c_iflag |= inpck;  

tcflush (fd, tciflush);  

options.c_cc[vtime] = 150

;  options.c_cc[vmin] = 0

;   /* update the options 

anddo it now */  

if(tcsetattr (fd, tcsanow, &options) != 

0)  

return

(true);  

}  void  

signal_handler_io (int status)  

int  

main ()  

else

set_speed (fd, 115200

);  

if(set_parity (fd, 8, 

1, 'n') == false)  

char buf[255

];  

fd_set rd;  

int nread = 0

;  while(1

)    

else

}  }  }  

close (fd);  

return

0;  

}  

串列埠資料接收處理

串列埠接收函式只需要管理資料的接收就行了,不必管理相應資料接收的是什麼,還有順序對不對,真正尋找資料的地方是在資料處理的地方。void usart2 irqhandler void 資料處理端,函式來自於onenet麒麟板程式 if dataptr null num atoi const char ...

arduino串列埠接收資料報 串列埠通訊

常見的通訊介面有usart can usb ethernet。最常見 用的最多的就是usart,下面主要對串列埠通訊協議的物理層及協議層進行講解。物理層 串列埠通訊的物理層有很多標準及變種,主要講解rs 232標準,rs 232標準主要規定了訊號的用途 通訊介面以及訊號的電平標準。使用rs 232標...

串列埠傳送接收浮點型資料

最近正在除錯nrf24l01無線通行模組,由於要fpga與pc機相互通訊,pc機沒spi,所以要個開發板 資料傳輸流程如下 上位機 串列埠 arm開發板 spi nrf24l01 另乙個nrf24l01 spi fpga開發板。其中遇到乙個頭疼的問題是傳輸的都是浮點型數,但傳送接受的是unsigne...