5

PL2303 ドライバを使用してシリアル ポートとして USB 接続を介してデータを読み込んでいます。openを実行すると、TTYオプションと非ブロックを設定すると、正常に戻ります。接続を閉じようとすると、ハングします。この状態では、文字ではなく「�」と表示されます。

キュートコムで問題なくデバイスに接続できます。ここに奇妙な部分があります:

  1. 最初にcutecom(シリアルモニター)を介してデバイスに接続すると、プログラムは接続され、その後毎回完全に正常に終了します。期待どおりに文字を読み取ります。(いいえ。)。
  2. ハードウェアを切断して再接続すると、cutecom を実行するまでプログラムが再びハングします。

キュートコムを使ってから動くので、最初の接続、接続設定が何か足りない気がします。接続に使用するものは次のとおりです。

baud_rate = 38400;
fd =  open (device_path, O_RDONLY | O_NOCTTY );

私のset_tty_options機能では:

struct termios tty_options;

memset (&tty_options, 0, sizeof(tty_options));
tcgetattr (fd, &tty_options);

cfsetispeed(&tty_options, baud_rate);                         // set baud rate
tty_options.c_cflag = (tty_options.c_cflag & ~CSIZE) | CS8;   // 8 bit msgs
tty_options.c_cflag |= (CLOCAL | CREAD);                      // enable reading

tty_options.c_cflag &= ~(PARENB | PARODD);                    // shut off parity
tty_options.c_cflag |= parity;
tty_options.c_cflag &= ~CSTOPB;
tty_options.c_cflag &= ~CRTSCTS;

if (tcsetattr (fd, TCSANOW, &tty_options) != 0) 
{
  printf("error %d from tcsetattr\n", errno);
  return TTY_ERROR;
}

関数set_blocking内:

if (tcgetattr (fd, &tty) != 0)
{
  printf("error %d from tggetattr", errno);
  return FAILURE;
}

// 0 or 1 byte is enough to return from read
tty.c_cc[VMIN]  = should_block ? 1 : 0; 
tty.c_cc[VTIME] = 5;            // 0.5 seconds read timeout

if (tcsetattr (fd, TCSANOW, &tty) != 0) 
{
  printf("error %d setting term attributes", errno);
  return FAILURE;
}
4

2 に答える 2