gpt4 book ai didi

c - 在没有 O_NONBLOCK 标志的情况下,在 OS X 上打开串口永远挂起

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:48 26 4
gpt4 key购买 nike

我有一个串行到 USB 转换器(FTDI,从 http://www.ftdichip.com/Drivers/VCP.htm 安装的驱动程序)将串行设备连接到 MacBook Air。它在 MacBook 上显示为 /dev/cu.usbserial-A4017CQY/dev/tty.usbserial-A4017CQY无论我使用这两个中的哪一个,我描述的所有行为都是相同的。

编辑:使用 /dev/cu.* 确实解决了问题。我不确定为什么当我第一次发布这个问题时它似乎不起作用。感谢 duskwuff 为我指明了正确的方向,尽管他的 TTY 名称倒过来了:/dev/tty.* 将等待流量控制,而 /dev/cu.* 不会。

我遇到的第一个问题是,如果我不使用 O_NONBLOCK 标志,对 open() 的系统调用将永远阻塞。使用标志,我得到了一个很好的文件描述符,但是 write() 似乎并没有真正写入(尽管它返回的很好,声称已经写入了字节),并且 read() 失败,出现错误“资源暂时不可用”。

stty -af/dev/cu.usbserial-A4017CQY 显示设置很好,但是如果我尝试使用像 stty -f/dev/cu.usbserial 这样的命令更改它们-A4017CQY -clocal,当连续调用 stty 时,它们确实发生了变化。

如果我使用 select() 等待设备在读取/写入之前准备就绪,它会在短时间后报告它已准备好写入,但永远不会读取。这与 write() 如何毫无怨言地完成,而 read() 失败有关。请注意,写入的数据实际上从未到达设备。

我编写的用于调试的整个测试程序如下:

#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <sys/select.h>

#define SYSCALL(A) do { ret = A; if (ret == -1) { perror(#A); return -1; } else printf("%s returned %d\n", #A, ret); } while (0)
int ret; /* necessary for SYSCALL */

int main()
{
struct termios tio;
char buf[256];
int fd = open("/dev/cu.usbserial-A4017CQY",
O_RDWR | O_NOCTTY | O_NONBLOCK);
fd_set rfds, wfds, xfds;
struct timeval to;
to.tv_sec = 5;
to.tv_usec = 0;

SYSCALL(tcgetattr(fd, &tio));

cfmakeraw(&tio);

tio.c_cflag = CS8|CREAD|CLOCAL;
tio.c_cc[VMIN] = 1;
tio.c_cc[VTIME] = 1;

cfsetispeed(&tio, B115200);
cfsetospeed(&tio, B115200);

SYSCALL(tcsetattr(fd, TCSANOW, &tio));

FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_ZERO(&xfds);
FD_SET(fd, &rfds);
FD_SET(fd, &wfds);
FD_SET(fd, &xfds);

int ret = select(fd+1, &rfds, NULL, &xfds, &to);
if (ret == -1) perror("select");
else if (ret > 0)
{
if(FD_ISSET(fd, &rfds))
puts("Ready to read");
if(FD_ISSET(fd, &wfds))
puts("Ready to write");
if(FD_ISSET(fd, &xfds))
puts("Exception!");
}
else puts("Timed out!");

SYSCALL(write(fd, "/home\n", 5));
SYSCALL(read(fd, buf, 256));

return 0;
}

最佳答案

您遇到了流量控制问题。要么环回连接电缆上的 RTS/CTS 和 DTR/DSR/CD,让另一端提供控制信号,要么像@duskwuff 建议的那样,使用忽略流量控制的设备。

我看到您正在设置 CLOCAL -- 这应该可以工作,但有些 USB 设备不正确。您的描述与等待调制解调器控制信号的设备一致。

关于c - 在没有 O_NONBLOCK 标志的情况下,在 OS X 上打开串口永远挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26498582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com