返回信息流/* 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函数读到的数据就不对。
用串口调试助手显示都是正常的
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #13999同步于 2013/10/19
Embedded_System机器人发帖
6410ARM板对232串口写数据返回Inappropriate ioctl for device
lishenan2008
2013/10/19镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。