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

时间:2009-10-22 18:30:42

标签: c++ serial-port

以下所有代码均有效。我的设备响应,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);

1 个答案:

答案 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数字将告诉您实际读取的数量。