串口读写,select 检测有数据时就接收,防止阻塞问题
2016-09-05 18:02
435 查看
Makefile:
uart_raw.c:
测试:
EXEC = uart_raw OBJS = uart_raw.o SRC = uart_raw.c #CC = arm-none-linux-gnueabi-gcc CC = /home/hongzhunzhun/work/OpenWrt-SDK-sunxi-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-arm_cortex-a7+neon_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/bin/arm-openwrt-linux-uclibcgnueabi-g++ CFLAGS += -O2 -Wall LDFLAGS += all:$(EXEC) $(EXEC):$(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) %.o:%.c $(CC) $(CFLAGS) -c $< -o $@ clean: @rm -vf $(EXEC) *.o *~
uart_raw.c:
#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> #include <limits.h> #include <unistd.h> #include <string.h> #include <signal.h> #define DEV_NAME "/dev/ttyS2" int testi=0; //不调用 int recv_protocol(int uart_fd,char* buf, int n) { int rc, i; int count = 0; while(read(uart_fd, buf, n) >0) { printf("recv serial----rc is %d testi is %d \n ",rc,testi); for(i = 0; i < n; i++) printf(" %x ", buf[i]); } printf("no while !!!\n"); for(i = 0; i < n; i++) printf(" %x ", buf[i]); printf("\n"); tcflush(uart_fd, TCIOFLUSH); return rc; } // 等待时间 串口描述符 读取的buff int Select_Tart_Read(struct timeval tv,int uart_fd,char* buff) { memset(buff,0,sizeof(char)*8); fd_set rfds; int retval=0; int i; FD_ZERO(&rfds); FD_SET(uart_fd, &rfds); retval=select(uart_fd + 1, &rfds, NULL, NULL, &tv); if(retval<0) { perror("select error\n"); } else { if( retval && FD_ISSET(uart_fd, &rfds) ) { testi++; printf("FD_ISSET!\n"); int rc=read(uart_fd, buff, 8); if(rc>0) { printf("recv serial----rc is %d testi is %d \n ",rc,testi); for(i = 0; i < 8; i++) printf(" %x ", buff[i]); printf("\n"); return rc; } } } return 0; } int monitor_routine( int uart_fd) { int i; printf("in monitor_routine\n"); char rebuff[8];//设置最大的数据长度为8个 memset(rebuff,0,sizeof(char)*8); struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 10000; int retval; unsigned char commbuff[8];//设置最大的数据长度为8个 memset(commbuff,0,sizeof(unsigned char)*8); while(1) { //printf("retval is %d\n",retval); if(Select_Tart_Read(tv,uart_fd,rebuff)>0)// { printf("in while Read!\n"); for(i = 0; i < 8; i++) printf(" %x ", rebuff[i]); printf("\n"); } } return 0; } int main(int argc, char *argv[]) { int iFd, i; int len; unsigned char ucBuf[100]; struct termios opt; iFd = open(DEV_NAME, O_RDWR | O_NOCTTY); if(iFd < 0) { perror(DEV_NAME); printf(" open /dev/ttyS2 faurel!\n"); return -1; } else printf(" open /dev/ttyS2 !\n"); tcgetattr(iFd, &opt); cfsetispeed(&opt, B115200); cfsetospeed(&opt, B115200); if (tcgetattr(iFd, &opt)<0) { return -1; } opt.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); opt.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); opt.c_oflag &= ~(OPOST); opt.c_cflag &= ~(CSIZE | PARENB); opt.c_cflag |= CS8; opt.c_cc[VMIN] = 255; opt.c_cc[VTIME] = 150; if (tcsetattr(iFd, TCSANOW, &opt)<0) { return -1; } tcflush(iFd,TCIOFLUSH); for (i = 0; i < 100; i++){ ucBuf[i] = 0xff - i; } char buff[6]; buff[0]=0x05;buff[1]=0x05;buff[2]=0x05;buff[3]=0x05;buff[4]=0x05;buff[5]=0x05; printf("buff is :\n"); for(i=0;i<6;i++) printf("0x%x ",buff[i]); printf("\n"); printf("write buff!!!"); len = write(iFd, buff, 6); if(len < 0) { printf(" write error ! \n"); return -1; } printf("in main monitor_routine\n"); monitor_routine(iFd); printf("\n"); close(iFd); return 0; }
测试:
相关文章推荐
- linux下的select用于串口接收数据时,select函数无法返回的问题
- 串口接收时丢数据问题解决方案
- 关于串口数据接收相关问题
- LWIP接收数据阻塞问题
- Linux 串口 一次性read接收不定长的数据(非阻塞,非延时) 程序分析
- 安卓 关于接收串口数据的问题
- 串口接收数据及时返回问题(电能表测试的上位机应用程序)
- 关于串口接收数据不全的问题
- labview串口发送与接收数据格式问题
- vc mscom控件串口接收不到数据问题
- 串口接收时丢数据问题解决方案
- 基础问题:在一个 Activity 中定义的串口接收程序,如果 Activity 切换到其它 Activity 后还能接收到串口数据吗?
- net2.0下实现串口接收GPS数据读写(-)
- STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和不能接收数据问题讨论
- GPS数据串口接收的数据 是否在一个设定好的检测区内
- 解决“串口接收数据时被截断”的问题
- 串口接收数据错误0D变0A问题
- 基础问题:在一个 Activity 中定义的串口接收程序,如果 Activity 切换到其它 Activity 后还能接收到串口数据吗?
- Linux下串口编程遇 接收数据错误问题及原因
- STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题