我正在使用PL2303驱动通过USB连接作为串行端口读取数据。当进行open
并设置TTY选项和非阻塞时,它返回成功。但是,当我尝试关闭连接时,它会挂起。在这种情况下,它会读取 "�" 而不是字符。
我可以使用cutecom完美地连接到设备。这里是奇怪的部分:
- 如果我首先通过cutecom(一个串行监视器)连接到设备,那么我的程序每次连接和关闭都能够正常运行。它会按照我期望的读取字符。(没有 �)。
- 如果我断开并重新连接硬件,我的程序将再次挂起,直到我运行cutecom。
由于我使用cutecom之后它可以工作,这使我认为我在初始连接或连接设置中缺少了一些东西。以下是我用来连接的内容:
baud_rate = 38400;
fd = open (device_path, O_RDONLY | O_NOCTTY );
在我的
set_tty_options
函数中:struct termios tty_options;
memset (&tty_options, 0, sizeof(tty_options));
tcgetattr (fd, &tty_options);
cfsetispeed(&tty_options, baud_rate); // set baud rate
tty_options.c_cflag = (tty_options.c_cflag & ~CSIZE) | CS8; // 8 bit msgs
tty_options.c_cflag |= (CLOCAL | CREAD); // enable reading
tty_options.c_cflag &= ~(PARENB | PARODD); // shut off parity
tty_options.c_cflag |= parity;
tty_options.c_cflag &= ~CSTOPB;
tty_options.c_cflag &= ~CRTSCTS;
if (tcsetattr (fd, TCSANOW, &tty_options) != 0)
{
printf("error %d from tcsetattr\n", errno);
return TTY_ERROR;
}
在
set_blocking
函数中:if (tcgetattr (fd, &tty) != 0)
{
printf("error %d from tggetattr", errno);
return FAILURE;
}
// 0 or 1 byte is enough to return from read
tty.c_cc[VMIN] = should_block ? 1 : 0;
tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
if (tcsetattr (fd, TCSANOW, &tty) != 0)
{
printf("error %d setting term attributes", errno);
return FAILURE;
}
set_tty_options
函数似乎没有完全初始化tty_options
结构体。这可能解释了“如果我先运行X,我的程序就能工作,但是单独运行会挂起/失败”的问题。这是一个程序不正确或未完全初始化其环境的典型症状。其次,对于规范输入,set_blocking
函数是错误的。c_cc [VMIN]
和c_cc [VTIME]
只应用于非规范(也称为原始)输入。对于规范输入的非阻塞read()
,请使用fcntl()
进行设置。 - sawdust