繁体   English   中英

C ++串行端口仅使用Write()响应一次

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM