Write()を使用して1回だけ応答するC ++シリアルポート
-
05-07-2019 - |
質問
以下のすべてのコードは機能します。デバイスが応答し、C、7がリセットされます。 2回目にこれを実行すると、応答しません。デバイスを手動でオフにしてからオンにした場合、このスクリプトを再度実行すると動作します。ただし、2回目にスクリプトを実行するためにボタンを押した場合ではありません。
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()
関数の3番目のパラメーターは、書き込まれるバイト数を示します。
ssize_t write(int fildes, const void *buf, size_t nbyte);
詳細については、 write()のmanページを参照してください。
>5文字(「C」、「7」、「\ r」、「\ n」)を送信しているため、あなたの場合、番号は5でなければなりません。
1024の値を指定すると、実際にはシリアルチャネルを介して別の1019個の文字化けが送信されます。
更新:
read()
関数の引数はほぼ同じです:
ssize_t read(int fildes, void *buf, size_t nbyte);
2番目のパラメーターとして書き込み可能なバッファーを提供する必要があることに注意してください。たとえば、12バイトを読み取るには、次を使用します。
char someData[12];
read(fd, someData, 12);
読む必要がある文字の数を判断する方法はよくわかりませんが、関数によって返される ssize_t
の数値から、実際に読み取られた文字数がわかります。