之前基於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...