我有一个通过 USB 连接到我的计算机的定制 Arduino 硬件。我编写了一个简单的测试套接字程序来简单地发送一个测试单并接收一个响应。这适用于 Windows 和 Linux,但不适用于 OSX。
如果我打开像 ZTerm 或 screen 这样的终端应用程序,我可以在 Mac 上正常连接,而不是使用 /dev/tty.usbmodemxxxx 通过套接字。我可以通过 /dev/cu.usbmodemxxxx 连接,它似乎在程序中正确发送,但从未收到任何数据。我已验证硬件未通过 /dev/cu 套接字接收数据。
该代码是相当直接的 c 代码。
socket = open("/dev/tty.usbmodemxxxx", O_RDWR | O_NOCTTY | O_ASYNC);
if (socket < 0) { // error here };
// -- edit -- added baud rate change.
struct termios term;
memset(&term, 0, sizeof(struct termios));
cfmakeraw(&term);
cfsetspeed(&term, COM_SPD);
term.c_cflag = CREAD | CLOCAL;
term.c_cflag |= CS8;
term.c_cc[VMIN] = 0;
term.c_cc[VTIME] = 10;
ioctl(socket, TIOCSETA, &term);
// -- /edit --
char str[1024] = { 0x30, 0x08, ... };
write(socket, str, 8);
sleep(2);
char data[64] = { 0x0 };
int len = 0;
ioctl(socket, data, &len);
read(socket, data, len);
// output data.
为简单起见,我省略了所有错误处理和调试代码。
有什么原因我无法通过 tty 连接吗?还有为什么我可以通过 cu 进行连接但从未收到来自硬件的任何响应?
此外,如果我使用 Z-Term 连接到设备,然后在程序中使用 /dev/cu 发送响应,硬件会收到数据,ZTerm 会收到正确的响应,但程序什么也没收到。
在 OS X 上连接到 tty 设备有什么特别需要做的吗?