[英]C++ Serial Port Only Responding Once Using Write()
下面的所有代码均有效。 我的设备响应,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);
1024实际上可能是您的问题。 write()
函数的第三个参数指示要写入的字节数:
ssize_t write(int fildes, const void *buf, size_t nbyte);
有关详细信息,请参见手册页中的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
数,但是函数返回的ssize_t
数字将告诉您实际读取了多少字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.