1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 串口通信——接收串口数据并处理(C语言)

串口通信——接收串口数据并处理(C语言)

时间:2020-06-26 20:15:23

相关推荐

串口通信——接收串口数据并处理(C语言)

本文主要内容包含:

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 <stdio.h>#include <string.h>#include <sys/types.h>#include <errno.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <termios.h>#include <stdlib.h>#define TRUE 1#define FALSE 0int 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;i<255,i++){printf("%s ",p[i]);}return 0;}void main(void){int fd;int nread;char buff[255];char *dev_name = "/dev/ttymxc4";//根据实际情况选择串口while(1) { fd = OpenDev(dev_name); //打开串口 if(fd>0) 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);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。