您的位置:首页 > 其它

串口读写,select 检测有数据时就接收,防止阻塞问题

2016-09-05 18:02 435 查看
Makefile:

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;
}


测试:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: