以下所有代码均有效。我的设备响应,C,7是重置。当我第二次运行时它没有响应。如果我手动关闭并打开设备,则再次运行此脚本即可。但是,如果我第二次按下按钮来运行脚本,那就不行了。
RS232:57600,8,N,1
任何想法?是否需要更多信息来解决这个问题?
*当我开始工作时,我将不得不使用read()函数来获取设备响应。有没有人知道我需要使用的正确格式,基于以下代码?对不起,我是C ++的新手......我更像是一个PHP人。
*我也不知道1024是否正确,但似乎有效......呃...
#include <termios.h>
int fd;
struct termios options;
fd=open("/dev/tty.KeySerial1", O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, 0);
tcgetattr(fd,&options);
options.c_ispeed=57600;
options.c_ospeed=57600;
options.c_cflag |= (CLOCAL | CREAD);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_cflag &= ~CSTOPB;
options.c_lflag &= ~ECHO;
options.c_oflag &= ~ECHO;
options.c_oflag &= ~OPOST;
options.c_cflag |= CS8;
options.c_cflag |= CRTSCTS;
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] =10;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&options);
write(fd, "C,7\r\n", 1024);
close(fd);
答案 0 :(得分:3)
1024实际上可能是你的问题。 write()
函数的第三个参数表示要写入的字节数:
ssize_t write(int fildes, const void *buf, size_t nbyte);
有关详细信息,请参阅man page for write()。
在你的情况下,数字应为5,因为你要发送5个字符('C'',''7''\ r'和'\ n')。
通过提供1024的值,您实际上是通过串行通道发送另外1019个垃圾字符。
<强>更新强>
read()
函数具有几乎相同的参数:
ssize_t read(int fildes, void *buf, size_t nbyte);
请注意,您必须提供可写缓冲区作为第二个参数。例如,要读取12个字节,您将使用:
char someData[12];
read(fd, someData, 12);
我不太确定如何确定您需要阅读的字符数,但该函数返回的ssize_t
数字将告诉您实际读取的数量。