1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <sys/types.h> 5 #include <sys/stat.h> 6 #include <fcntl.h> //文件控制定义 7 #include <termios.h>//终端控制定义 8 #include <errno.h> 9 10 char *comport; 11 int bRate = 0; 12 13 int serial_fd = 0; 14 15 //打开串口并初始化设置 16 int init_serial(void) 17 { 18 serial_fd = open(comport, O_RDWR | O_NOCTTY | O_NDELAY); 19 if (serial_fd < 0) { 20 perror("open"); 21 return -1; 22 } 23 else 24 printf("open %s success! \n", comport); 25 26 //串口主要设置结构体termios <termios.h> 27 struct termios options; 28 29 /**1. tcgetattr函数用于获取与终端相关的参数。 30 *参数fd为终端的文件描述符,返回的结果保存在termios结构体中 31 */ 32 tcgetattr(serial_fd, &options); 33 /**2. 修改所获得的参数*/ 34 options.c_cflag |= (CLOCAL | CREAD);//设置控制模式状态,本地连接,接收使能 35 options.c_cflag &= ~CSIZE;//字符长度,设置数据位之前一定要屏掉这个位 36 options.c_cflag &= ~CRTSCTS;//无硬件流控 37 options.c_cflag |= CS8;//8位数据长度 38 options.c_cflag &= ~CSTOPB;//1位停止位 39 options.c_iflag |= IGNPAR;//无奇偶检验位 40 options.c_oflag = 0; //输出模式 41 options.c_lflag = 0; //不激活终端模式 42 43 switch(bRate) 44 { 45 case 9600:cfsetospeed(&options, B9600);break;//设置波特率 46 case 115200:cfsetospeed(&options, B115200);break;//设置波特率 47 } 48 49 /**3. 设置新属性,TCSANOW:所有改变立即生效*/ 50 tcflush(serial_fd, TCIFLUSH);//溢出数据可以接收,但不读 51 tcsetattr(serial_fd, TCSANOW, &options); 52 53 return 0; 54 } 55 56 void uart_recv(int fd) 57 { 58 char data[1024]; 59 int len=0, ret = 0; 60 fd_set fs_read; 61 struct timeval tv_timeout; 62 63 FD_ZERO(&fs_read); 64 FD_SET(fd, &fs_read); 65 tv_timeout.tv_sec = 6000;//(10*20/115200+2); 66 tv_timeout.tv_usec = 0; 67 68 while (1) 69 { 70 ret = select(fd+1, &fs_read, NULL, NULL, &tv_timeout); 71 //printf("ret = %d\n", ret); 72 if (FD_ISSET(fd, &fs_read)) { 73 len = read(fd, data, sizeof(data)); 74 printf("len: %d(bytes) recv: %s\n", len, data); 75 } else { 76 perror("select"); 77 } 78 } 79 } 80 81 int main(int argc, char **argv) 82 { 83 comport = (char *)malloc(1024); 84 memset(comport, ‘\0‘, sizeof(comport)); 85 if (argc == 1) 86 { 87 comport = "/dev/ttyS6"; 88 bRate = 9600; 89 } 90 else if (argc == 3) 91 { 92 switch(atoi(argv[1])) 93 { 94 case 0:comport = "/dev/ttyS0";break; 95 case 1:comport = "/dev/ttyS1";break; 96 case 2:comport = "/dev/ttyS2";break; 97 case 3:comport = "/dev/ttyS3";break; 98 case 4:comport = "/dev/ttyS4";break; 99 case 5:comport = "/dev/ttyS5";break; 100 case 6:comport = "/dev/ttyS6";break; 101 default: printf("argv[0](com port id) should be 0 to 6 !\n");exit(0); 102 } 103 switch(atoi(argv[2])) 104 { 105 case 9600: bRate = 9600; break; 106 case 115200: bRate = 115200; break; 107 default: printf("argv[1](bRate) should be 9600 or 115200 !\n");exit(0); 108 } 109 } 110 else{ 111 printf("parameter count error!\n"); 112 return 0; 113 } 114 115 init_serial(); 116 printf("current BaudRate is %d\n", bRate); 117 //uart_send(serial_fd, buf, sizeof(buf)); 118 uart_recv(serial_fd); 119 free(comport); 120 close(serial_fd); 121 return 0; 122 }
时间: 2024-11-05 12:22:12