Ubuntu12システムでCを使用してシリアルポートからデータを取得する際に問題が発生します。
私はopen()とread()を使用しています、そしてここに私のコードがあります:
Fd = open("/dev/ttyUSB0", O_RDONLY | O_NOCTTY);
if (Fd == -1) {
printf("Could not open serial port: %s\n", strerror(errno));
return 1;
}
fcntl(Fd, F_SETFL, 0);
char buf;
while (1) {
read(Fd, &buf, 1);
printf("%c", buf);
}
ただし、シリアルデバイスは「Boot。\ r \ n」に続いて「Tosend:」を送信するように設定されていますが、デバイスを接続してプログラムを起動すると、最初の行(「Boot。」)のみが表示され、次にもういや。gtkterm / picocomを起動すると、すぐに両方の行が表示されます。
また、以下を使用して、ポートを適切に閉じるためにSIGTERMのシグナルハンドラーを追加しようとしました。
void signal_callback_handler(int signum) {
printf("Caught SIGTERM\n");
close(Fd);
exit(signum);
}
と
signal(SIGINT, signal_callback_handler);
これを使用すると、CTRL-Cを押すと次のようになります。
Boot.
^CTo send: Caught SIGTERM
また、最初に次を使用してポートを設定してみました。
struct termios port_settings; // structure to store the port settings in
cfsetispeed(&port_settings, B115200); // set baud rates
cfsetospeed(&port_settings, B115200);
port_settings.c_cflag &= ~PARENB; // set no parity, stop bits, data bits
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;
tcsetattr(Fd, TCSANOW, &port_settings);// apply the settings to the port
これは状況を悪化させるだけです-私は�:(でスパムされます
よろしくお願いします。