#ifndef __UART_H_ #define __UART_H_ //#include "njrc_buc_ctr.h" //#include "wavstr_buc_ctr.h" #define UART0 "/dev/ttyAT1" //0 #define UART1 "/dev/ttyAT2" //1 #define UART2 "/dev/ttyAT3" //2 #define WIFI_UART "/dev/ttyAT4" //3 modem控制的串口 #define UART_422 "/dev/ttyAT5" //422 功放控制串口 #define FSK_UART "/dev/ttyAT6" // #define UART_TEST "/dev/ttyS1" //#define UART_TEST "/dev/ttyUSB0" #define BUC_CTR_UART UART0 #define FALSE 0 #define TRUE 1 #define _DEBUG 1 extern int buc_uart_fd; extern int buc_init(const char * uart_dev); //extern int buc_write(SET_BUC_DATA *send_buc_data,const int fd); //extern int buc_read(GET_BUC_DATA * buc_buf, int fd); #endif
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <termios.h> #include <fcntl.h> #include <errno.h> #include <time.h> #include "uart.h" //#include "njrc_buc_ctr.h" //#include "wavstr_buc_ctr.h" int buc_uart_fd = 0; static int speed_arr[] = { B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200 }; static int name_arr[] = { 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200 }; 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; } 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; break; case 'e': case 'E': options.c_cflag |= PARENB; options.c_cflag &= ~PARODD; options.c_iflag |= INPCK; 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; } options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); options.c_oflag &= ~OPOST; options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); /* Set input parity option */ if (parity != 'n') { options.c_iflag |= INPCK; } options.c_cc[VTIME] = 150; // 15 seconds options.c_cc[VMIN] = 0; tcflush(fd, TCIFLUSH); /* Update the options and do it NOW */ if (tcsetattr(fd, TCSANOW, &options) != 0) { perror("SetupSerial 3"); return FALSE; } return TRUE; } /*============================================================= * * Function : buc_init * * Description : open buc com * * Input Para : ttyS(num) * * Output Para : buc_fd,dev fd * * Return Value: if error return -1 ,else return dev fd * *=============================================================*/ int buc_init(const char * uart_dev) { int uart_fd = -1; if ((uart_fd = open(uart_dev, O_RDWR | O_NONBLOCK)) < 0) // buc { perror("open() uart_fd"); uart_fd = open(uart_dev, O_RDWR | O_NONBLOCK); }else; set_speed(uart_fd, 9600); if (set_Parity(uart_fd, 8, 1, 'N') == 0) close(uart_fd); return uart_fd; } #if 0 /*============================================================= * * Function : buc_write * * Description : write to buc cmd * * Input Para : write msg, dev_fd * * Output Para : NULL * * Return Value: if error return -1 ,else return 0 * *=============================================================*/ int buc_write(SET_BUC_DATA *send_buc_data,const int fd) { char buf[100] = { 0 }; int size, ret = 0, pos = 0; size = send_buc_data->buc_buf_len; memcpy(buf, send_buc_data->set_buc_buf, size); while (size > 0) { ret = write(fd, buf + pos, size); if (ret < 0) { if (errno == EINTR) { continue; }else{ perror("write()"); return -1; } }else; size -= ret; pos += ret; } return 0; } /*============================================================= * * Function : buc_read * * Description : read msg from buc * * Input Para : read msg struct addr, dev_fd * * Output Para : read msg * * Return Value: if error return -1 ,else return 0 * *=============================================================*/ int buc_read(GET_BUC_DATA * buc_buf, int fd) { int num = 0, num_tmp = 0, return_num = 0; char i = 0; int loop = 50; if(buc_buf->buc_buf_len < 1) buc_buf->buc_buf_len = 47; buc_buf->read_len = 0; if (fd < 1) { fd = buc_init(BUC_CTR_UART); buc_uart_fd = fd; } if (fd > 0) { while (loop) { usleep(300); num_tmp = read(fd, &(buc_buf->get_buc_buf[num]), buc_buf->buc_buf_len+1); if(num_tmp > -1){ num += num_tmp; }else; if (num >= buc_buf->buc_buf_len) { break; } else; loop--; } // if (num >= buc_buf->buc_buf_len) { #if _DEBUG printf("num:%d\n",num); for (i = 0; i < num; i++) { //printf("[%d][%02x]%c ",i, buc_buf->get_buc_buf[i], buc_buf->get_buc_buf[i]); printf("[%d]%c " ,i,buc_buf->get_buc_buf[i]); } printf("\n"); #endif // } else; }else return_num = -1; buc_buf->read_len = num; return return_num; } #endif