void com::open()
{
fd = ::open( "/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY );
if ( fd < 0 )
{
throw exceptionSystem( ERROR_UNK, "Error open COM port" );
}
int err;
err = fcntl(fd, F_SETFL, FNDELAY);
if ( err == -1 )
{
close();
throw exceptionSystem( ERROR_UNK, "Error fcntl" );
}
try{
set();
}catch(...){
close();
throw;
}
}
void com::set()
{
if ( fd == -1 )
return;
struct termios tty;
memset( &tty, 0, sizeof( tty ) );
if ( tcgetattr(fd, &tty) != 0 )
{
throw exceptionSystem( ERROR_UNK, "Error tcgetattr" );
}
int err;
err = cfsetospeed( &tty, B115200 );
if ( err != 0 )
{
throw exceptionSystem( ERROR_UNK, "Error fsetospeed" );
}
err = cfsetispeed( &tty, B115200 );
if ( err != 0 )
{
throw exceptionSystem( ERROR_UNK, "Error cfsetispeed" );
}
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_cflag |= PARENB;
tty.c_cflag &= ~PARODD;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag |= CLOCAL;
tty.c_cflag |= CREAD;
tty.c_cflag &= ~CRTSCTS;
tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
tty.c_iflag |= (INPCK | ISTRIP);
tty.c_iflag &= ~IGNPAR;
tty.c_iflag &= ~PARMRK;
tty.c_iflag &= ~(IXON | IXOFF | IXANY);
tty.c_oflag &= ~OPOST;
tty.c_cc[VMIN] = 0;
tty.c_cc[VTIME] = 0;
if ( tcsetattr( fd, TCSANOW, &tty ) != 0 )
{
throw exceptionSystem( ERROR_UNK, "Error tcsetattr" );
}
}
答案 0 :(得分:5)
编辑我刚看到问题所在。你有这条线
tty.c_iflag |= (INPCK | ISTRIP);
ISTRIP
表示&#34;剥离第8位&#34;。你需要
tty.c_iflag |= INPCK;
简单地启用输入奇偶校验。
您已启用EVEN奇偶校验
tty.c_cflag |= PARENB;
tty.c_cflag &= ~PARODD;
以及8位字节
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
这样一个起始位,8个数据位,1个奇偶校验位和1个停止位。我不确定FTDI芯片可以处理所有这些!
如果您不想要奇偶校验,请使用
tty.c_cflag &= ~PARENB;
如果我对FTDI芯片进行了诽谤,我道歉 - 在这种情况下你确定另一端配置方式相同吗?与8E1
或7E1
8N1
并不常见