linux下串口的操作

来源:互联网 发布:校园网mac地址修改 编辑:程序博客网 时间:2024/05/02 02:56


通常I/O操作都是有阻塞与非阻塞的两种方式。串口也不例外。所以,我们有必要来了解一下串口阻塞与非阻塞的操作。
关于这个的具体细节,可以参考这篇文章,http://my.oschina.net/mlgb/blog/300925
我来总结一下。串口阻塞与非阻塞可以在以下情况中进行设置。
1.当open串口的时候</span>
2.当进行超时设置的时候,利用 struct termios 的 cc_t c_cc[NCCS] 成员
3.fcntl函数改变串口的状态(阻塞与非阻塞)
下面来看一下具体的代码吧

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <sys/ioctl.h>#include <termios.h>#include <string.h>#define DEBUG 1int nComFd;static intUART_Initial(char *dev){if(DEBUG)printf("file=%s,func=%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__);nComFd = open(dev, O_RDWR|O_NOCTTY);//以阻塞的方式打开if (nComFd <= 0 ){printf("Couldn't open /dev/%s",dev);return -1;}else{printf("open /dev/%s success!",dev);}#if 0if(fcntl(nComFd,F_SETFL,FNDELAY) < 0)//非阻塞,覆盖前面open的属性          {                 printf("fcntl failed\n");        return -1;        } if(fcntl(nComFd,F_SETFL,0) < 0)//阻塞,覆盖前面open的属性          {                 printf("fcntl failed\n");        return -1;        } #endifreturn 0;}static int UARTInit(unsigned long BauaRate, unsigned char DataBits, unsigned char Parity, unsigned char StopBits){if(DEBUG)printf("file=%s,func=%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__);struct termios newtio,oldtio;if(tcgetattr(nComFd,&oldtio)!=0){printf("SetupSerial 1");return -1;}bzero(&newtio,sizeof(newtio));newtio.c_cflag |= CLOCAL |CREAD;newtio.c_iflag &= ~CSIZE;switch(DataBits){case 5:newtio.c_cflag |= CS5;break;case 6:newtio.c_cflag |= CS6;break;case 7:newtio.c_cflag |= CS7;break;case 8:newtio.c_cflag |=CS8;break;default:newtio.c_cflag |=CS8;break;}switch(Parity){case '2':newtio.c_cflag |= PARENB;newtio.c_cflag |=PARODD;newtio.c_iflag |=(INPCK | ISTRIP);break;case '1': newtio.c_iflag |=(INPCK | ISTRIP);newtio.c_cflag |=PARENB;newtio.c_cflag &= ~PARODD;break;case '0':newtio.c_cflag &= ~PARENB;break;default:newtio.c_cflag &= ~PARENB;break;}switch(BauaRate){  case 2400:cfsetispeed(&newtio,B2400);cfsetospeed(&newtio,B2400);break;case 4800:cfsetispeed(&newtio,B4800);cfsetospeed(&newtio,B4800);break;case 9600:cfsetispeed(&newtio,B9600);cfsetospeed(&newtio,B9600);break;case 57600:cfsetispeed(&newtio,B57600);cfsetospeed(&newtio,B57600);break;case 115200:cfsetispeed(&newtio,B115200);cfsetospeed(&newtio,B115200);break;case 460800:cfsetispeed(&newtio,B460800);cfsetospeed(&newtio,B460800);break;default:cfsetispeed(&newtio,B9600);cfsetospeed(&newtio,B9600);break;}if(StopBits == 1) {newtio.c_cflag &= ~CSTOPB;}else if(StopBits == 2){newtio.c_cflag |= CSTOPB;}newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 1;tcflush(nComFd,TCIFLUSH);if((tcsetattr(nComFd,TCSANOW,&newtio))!=0){printf("com set error");return -1;}return 0;}int main(int argc, char *argv[]){if(argc!=2){printf("Usage: ./uart /dev/ttyOx \n");return -1;}UART_Initial(argv[1]);UARTInit(2400,8,0,1);int i = 0;unsigned char CharValue[] = {0x00, 0x01, 0x02, 0x03, 0x04 };unsigned char revbuffer[10];while(1){printf("Now I am a sender!!!!\n\n\n");while(1){int ret = write(nComFd,&CharValue[i],1);if(ret <= 0){printf("%s send data error!\n",argv[1]);return -1;}else{if(DEBUG)printf("Send data to %s success ret = %d value = %02x\n",argv[1],ret,CharValue[i]);}i++;if(i == 5){i = 0;break;}sleep(1);}printf("Now I am a rev!!!!!\n\n\n");while(1){int ret = read(nComFd,&revbuffer[i ],1);if(ret <= 0){printf("%s read data error!\n",argv[1]);return -1;}else{if(DEBUG)printf("read data from %s success ret = %d value = %02x\n",argv[1],ret,*revbuffer);}i++;if(i == 5){      i = 0;      memset(revbuffer,0,sizeof(revbuffer));break;}}}}
0 0