BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #13999同步于 2013/10/19
Embedded_System机器人发帖

6410ARM板对232串口写数据返回Inappropriate ioctl for device

lishenan2008
2013/10/19镜像同步0 回复
/* uart.h */ #ifndef __UART_H #define __UART_H #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <errno.h> #define GNR_COM 0 #define USB_COM 1 #define COM_TYPE GNR_COM #define MAX_COM_NUM 5 #define TIME_DELAY 180 #define SEL_FILE_NUM 2 /*打开串口*/ int open_com(int com_port); int open_com(int com_port) { int fd; #if (COM_TYPE == GNR_COM) char *dev[] = {"/dev/ttySAC0", "/dev/ttySAC1", "/dev/ttySAC2","/dev/ttySAC3"};//音视频矩阵是SAC1,485总线是SAC2 //char *dev[] = {"/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2","/dev/ttyS3"}; #else char *dev[] = {"/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2"}; #endif if ((com_port < 0) || (com_port > MAX_COM_NUM)) { return -1; } fd = open(dev[com_port], O_RDWR|O_NOCTTY|O_NDELAY); if (fd < 0) { perror("open serial port"); return(-1); } /*恢复串口为阻塞*/ if (fcntl(fd,F_SETFL,0) < 0) { perror("fcntl F_SETFL\n"); } /*再次验证是否正确打开*/ if (isatty(STDIN_FILENO) == 0) { perror("standard input is not a terminal device"); } return fd; } //配置串口 int set_com(int fd,int baud_rate, int data_bits, char parity, int stop_bits); int set_com(int fd,int baud_rate, int data_bits, char parity, int stop_bits) { struct termios new_cfg,old_cfg; int speed; /*保存现有串口参数设置*/ if (tcgetattr(fd, &old_cfg) != 0) { perror("tcgetattr"); return -1; } /*设置字符大小,配置为原始模式*/ new_cfg = old_cfg; cfmakeraw(&new_cfg); new_cfg.c_cflag &= ~CSIZE; /*波特率*/ switch (baud_rate) { case 2400: speed = B2400; break; case 4800: speed = B4800; break; case 9600: speed = B9600; break; case 19200: speed = B19200; break; case 38400: speed = B38400; break; case 57600: speed = B57600; break; case 115200: speed = B115200; break; default: speed = B9600; break; } cfsetispeed(&new_cfg, speed); cfsetospeed(&new_cfg, speed); /*设置数据长度*/ switch (data_bits) { case 7: new_cfg.c_cflag |= CS7; break; case 8: new_cfg.c_cflag |= CS8; break; default: new_cfg.c_cflag |= CS8; break; } /*奇偶校验*/ switch (parity) { default: case 'n': case 'N': new_cfg.c_cflag &= ~PARENB; new_cfg.c_iflag &= ~INPCK; break; case 'o': case 'O': new_cfg.c_cflag |= (PARODD | PARENB); new_cfg.c_iflag |= INPCK; break; case 'e': case 'E': new_cfg.c_cflag |= PARENB; new_cfg.c_cflag &= ~PARODD; new_cfg.c_iflag |= INPCK; break; case 's': /*as no parity*/ case 'S': new_cfg.c_cflag &= ~PARENB; new_cfg.c_cflag &= ~CSTOPB; break; } /*设置停止位*/ switch (stop_bits) { default: case 1: new_cfg.c_cflag &= ~CSTOPB; break; case 2: new_cfg.c_cflag |= CSTOPB; } /*设置等待时间和最小接收字符*/ new_cfg.c_cc[VTIME] = 10; new_cfg.c_cc[VMIN] = 11; /*处理未接收字符*/ tcflush(fd, TCIFLUSH); /*激活新配置*/ if((tcsetattr(fd, TCSANOW, &new_cfg)) != 0) { perror("tcsetattr"); return -1; } return 0; } #endif 每次打开串口调用write函数写数据的时候,就会在if (isatty(STDIN_FILENO) == 0)出输出错误信息,standard input is not a terminal device:Inappropriate ioctl device。 然后我调用read函数读到的数据就不对。 用串口调试助手显示都是正常的
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。