- 论坛徽章:
- 0
|
好久前写的几个设置函数
看用得上不
- /*
- * Desc : set uart baudrate
- */
- void set_speed(int fd, int speed)
- {
- int status;
- struct termios Opt;
- tcgetattr(fd, &Opt);
- tcflush(fd, TCIOFLUSH);
- cfsetispeed(&Opt, speed);
- cfsetospeed(&Opt, speed);
- status = tcsetattr(fd, TCSANOW, &Opt);
- if (status != 0) {
- perror("tcsetattr uart");
- return;
- }
- tcflush(fd,TCIOFLUSH);
- }
- int set_data_format(int fd,int databits,int stopbits,int parity)
- {
- struct termios opt;
- if( tcgetattr(fd, &opt) != 0) {
- perror("set uart");
- return(1);
- }
- opt.c_cflag &= ~CSIZE;
- switch (databits) {
- case 5:
- opt.c_cflag |= CS5;
- break;
- case 6:
- opt.c_cflag |= CS6;
- break;
- case 7:
- opt.c_cflag |= CS7;
- break;
- case 8:
- opt.c_cflag |= CS8;
- break;
- default:
- fprintf(stderr,"Unsupported data size\n");
- return (1);
- }
- switch (parity) {
- case 'n':
- case 'N':
- opt.c_cflag &= ~PARENB; /* Clear parity enable */
- opt.c_cflag &= ~PARODD;
- opt.c_iflag &= ~INPCK; /* Enable parity checking */
- break;
- case 'o':
- case 'O':
- opt.c_cflag |= (PARODD | PARENB); /* parity checking */
- opt.c_iflag |= INPCK; /* Disnable parity checking */
- break;
- case 'e':
- case 'E':
- //my setting
- opt.c_cflag |= PARENB;
- opt.c_cflag |= CLOCAL;
- opt.c_cflag |= CREAD;
- opt.c_cflag &= ~PARODD;
- opt.c_iflag &= ~INPCK;
- break;
- default:
- fprintf(stderr,"Unsupported parity\n");
- return (1);
- }
-
- switch (stopbits) {
- case 1:
- opt.c_cflag &= ~CSTOPB;
- break;
- case 2:
- opt.c_cflag |= CSTOPB;
- break;
- default:
- fprintf(stderr,"Unsupported stop bits\n");
- return (1);
- }
- /* Set input parity option */
- //opt.c_oflag = opt.c_iflag;
- //opt.c_iflag &= ~INPCK;//XXXXX,my god.....
- //opt.c_oflag = 0;//XXXXX,???
- opt.c_lflag = 0; //yes we need this
- opt.c_cc[VTIME] = 0;
- opt.c_cc[VMIN] = 1;
-
- tcflush(fd, TCIFLUSH); /* Update the options and do it NOW */
- if (tcsetattr(fd, TCSANOW, &opt) != 0) {
- perror("SetupSerial 3");
- return (1);
- }
- return 0;
- }
- void set_uart_for_msur(int msur_id, int fd)
- {
- int baudrate = 0, parity = 0, databits = 0, stopbits = 0;
- struct termios opt;
-
- simple_get_sys_option(&baudrate, 0x8905, 1, msur_id); //get baud rate
- simple_get_sys_option(&parity, 0x8930, 1, msur_id); //get parity
- simple_get_sys_option(&databits, 0x8931, 1, msur_id); //get databits
- simple_get_sys_option(&stopbits, 0x8932, 1, msur_id); //get stopbits
- baudrate *= 300;
- switch(baudrate)
- {
- case 300:
- baudrate = B300;
- break;
- case 1200:
- baudrate = B1200;
- break;
- case 2400:
- baudrate = B2400;
- break;
- case 4800:
- baudrate = B4800;
- break;
- case 9600:
- baudrate = B9600;
- break;
- case 19200:
- baudrate = B19200;
- break;
- case 38400:
- baudrate = B38400;
- break;
- case 57600:
- baudrate = B57600;
- break;
- case 115200:
- baudrate = B115200;
- break;
- case 230400:
- baudrate = B230400;
- break;
- default:
- DBG("***error set_uart_for_msur():non support baudrate\n");
- baudrate = B9600;
- break;
- }
- switch(stopbits)
- {
- case 0:
- stopbits = 1;
- break;
- case 2:
- stopbits = 3;
- break;
- default:
- DBG("***error set_uart_for_msur():non support stopbits\n");
- stopbits = 1;
- }
- switch(parity)
- {
- case 0:
- parity = 'N';
- break;
- case 1:
- parity = 'E';
- break;
- case 2:
- parity = 'O';
- break;
- default:
- DBG("***error set_uart_for_msur():non support parity\n");
- parity = 'E';
- }
- if( tcgetattr(fd, &opt) != 0) {
- return;
- }
- if ((opt.c_ispeed != baudrate) || (opt.c_ospeed != baudrate))
- set_speed(fd, baudrate);
- set_data_format(fd, databits, stopbits, parity);
- }
复制代码 |
|