串口通信

您所在的位置:网站首页 德基广场蒂芙尼专柜 串口通信

串口通信

2023-07-25 09:34| 来源: 网络整理| 查看: 265

本文主要内容包含:

 1.接收串口数据程序的编程逻辑示意图;

 2.接收串口数据程序要用到的通用函数模块(可直接引用,无需更改);

 3.接收串口数据程序的示例。

1.接收串口数据程序的编程逻辑示意图:

2.与串口有关的函数模块及数组(可直接引用到自己的程序中):

//设置波特率函数会用到的数组 int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, }; int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, }; int OpenDev(char *Dev) //打开串口 { int fd = open(Dev,O_RDWR | O_NOCTTY | O_NONBLOCK); if(-1 == fd) { perror("Can't Open Serial Port"); return -1; } else { printf("Open com success!!!!!!!!!!!"); return fd; } } void set_speed(int fd, int speed) //设置波特率 { int i; int status; struct termios Opt; tcgetattr(fd, &Opt); for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) { if (speed == name_arr[i]) { tcflush(fd, TCIOFLUSH); cfsetispeed(&Opt, speed_arr[i]); cfsetospeed(&Opt, speed_arr[i]); status = tcsetattr(fd, TCSANOW, &Opt); if (status != 0) perror("tcsetattr fd1"); return; } tcflush(fd,TCIOFLUSH); } } int set_Parity(int fd,int databits,int stopbits,int parity) //设置数据位、奇偶位、停止位等 { struct termios options; if ( tcgetattr( fd,&options) != 0) { perror("SetupSerial 1"); return(0); } bzero(&options,sizeof(options)); options.c_cflag |= CLOCAL | CREAD; options.c_cflag &= ~CSIZE; switch (databits) /*设置数据位*/ { case 7: options.c_cflag |= CS7; break; case 8: options.c_cflag |= CS8; break; default: fprintf(stderr,"Unsupported data size\n"); return (0); } switch (parity)/*设置校验位*/ { case 'n': case 'N': options.c_cflag &= ~PARENB; //options.c_iflag &= ~INPCK; break; case 'o': case 'O': options.c_cflag |= (PARODD | PARENB); options.c_iflag |= (INPCK | ISTRIP); break; case 'e': case 'E': options.c_cflag |= PARENB; options.c_cflag &= ~PARODD; options.c_iflag |= (INPCK | ISTRIP); break; case 'S': case 's': options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; break; default: fprintf(stderr,"Unsupported parity\n"); return (0); } switch (stopbits)/*设置停止位*/ { case 1: options.c_cflag &= ~CSTOPB; break; case 2: options.c_cflag |= CSTOPB; break; default: fprintf(stderr,"Unsupported stop bits\n"); return (FALSE); } if (parity != 'n') options.c_iflag |= INPCK; options.c_cc[VTIME] = 0; options.c_cc[VMIN] = 0; tcflush(fd,TCIFLUSH); if (tcsetattr(fd,TCSANOW,&options) != 0) { perror("SetupSerial 3"); return (0); } return (1); } 3.示例: #include #include #include #include #include #include #include #include #include #define TRUE 1 #define FALSE 0 int analysis(char *buff); int OpenDev(char *Dev); void set_speed(int fd, int speed); int set_Parity(int fd,int databits,int stopbits,int parity); int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, }; int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, }; int OpenDev(char *Dev) { int fd = open(Dev,O_RDWR | O_NOCTTY | O_NONBLOCK); if(-1 == fd) { perror("Can't Open Serial Port"); return -1; } else { printf("Open com success!!!!!!!!!!!"); return fd; } } void set_speed(int fd, int speed) { int i; int status; struct termios Opt;  tcgetattr(fd, &Opt); for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)  { if (speed == name_arr[i]) { tcflush(fd, TCIOFLUSH); cfsetispeed(&Opt, speed_arr[i]);  cfsetospeed(&Opt, speed_arr[i]);  status = tcsetattr(fd, TCSANOW, &Opt); if (status != 0) perror("tcsetattr fd1");  return;  } tcflush(fd,TCIOFLUSH);  } } int set_Parity(int fd,int databits,int stopbits,int parity) { struct termios options; if ( tcgetattr( fd,&options) != 0) {  perror("SetupSerial 1");  return(FALSE);  } bzero(&options,sizeof(options)); options.c_cflag |= CLOCAL | CREAD;  options.c_cflag &= ~CSIZE; switch (databits) { case 7: options.c_cflag |= CS7;  break;  case 8:  options.c_cflag |= CS8;  break; default: fprintf(stderr,"Unsupported data size\n");  return (FALSE); } switch (parity) {  case 'n': case 'N':  options.c_cflag &= ~PARENB;   options.c_iflag &= ~INPCK; break; case 'o':  case 'O': options.c_cflag |= (PARODD | PARENB);  options.c_iflag |= (INPCK | ISTRIP); break; case 'e': case 'E': options.c_cflag |= PARENB;  options.c_cflag &= ~PARODD; options.c_iflag |= (INPCK | ISTRIP); break; case 'S': case 's': options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB;  break;  default: fprintf(stderr,"Unsupported parity\n"); return (FALSE); } switch (stopbits)  { case 1:  options.c_cflag &= ~CSTOPB; break; case 2: options.c_cflag |= CSTOPB;  break; default: fprintf(stderr,"Unsupported stop bits\n"); return (FALSE); } if (parity != 'n') options.c_iflag |= INPCK; options.c_cc[VTIME] = 0;  options.c_cc[VMIN] = 0;  tcflush(fd,TCIFLUSH); if (tcsetattr(fd,TCSANOW,&options) != 0)  { perror("SetupSerial 3"); return (FALSE);  } return (TRUE); } int analysis (char *buff) { int i; char *p; p=buff; for(i=0;i0) set_speed(fd,9600); //设置波特率 else { printf("Can't Open Serial Port!\n"); sleep(1);   continue; } break; } if(set_Parity(fd,8,1,'N')==FALSE) //设置校验位 { printf("Set Parity Error\n"); exit(1); } while(1) { sleep(3); nread = read(fd,buff,sizeof(buff)); if((nread>0)) { printf("Success!\n"); } analysis(buff); } }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3