(1) 別のデバイスへのシリアル接続を開き、(2) 既知のコマンドを送信し、(3) 予期される応答フレーズまたは文字が検出されるまで、着信文字 (応答) のポートをチェックする組み込み Linux アプリケーションを作成しています (4 ) 一連のコマンドが送信され、応答が受信されるまでステップ 2 と 3 を繰り返し、(5) ポートを閉じます。
私のアプリは上記のシーケンスのいくつかのサイクルを通過し、組み込みのタイムアウト ロジックが原因で突然通信が停止し、ソフトウェアに障害が発生したときに応答 (読み取り) を待機していました。
ポート構成に、送信された特定のバイトが原因で (おそらく電気ノイズが原因で) ポートがブロックされる原因となるものはありますか?
ポートを開く方法は次のとおりです(termios.hを介して構成を表示します):
struct termios options;
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd == -1) {
debug() << "Port open failed!"
return FAIL;
}
debug() << "Port Opened Successful"
fcntl(fd, F_SETFL, 0); // This setting interacts with VMIN and VTIME below
// Get options
tcgetattr(fd, &options);
// Adjust Com port options
options.c_cflag |= (CLOCAL | CREAD); // Program will not "own" port, enable reading on port
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // Sets RAW input mode (does not treat input as a line of text with CR/LF ending)
options.c_oflag &= ~ OPOST; // Sets RAW ouput mode (avoids newline mapping to CR+LF characters)
options.c_iflag &= ~(IXON | IXOFF | IXANY); // Turns off SW flow c
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 10;
// Set options
tcsetattr(fd, TCSANOW, &options);
//return fd;
return SUCCEED;
デバイスの電源を入れ直すと、通信が突然フリーズして消えてしまう理由がわかりません。皆さんありがとう!
詳細 - これが私の読み取りおよび書き込み機能です。
int Comm::Receive(unsigned char* rBuf)
{
int bytes;
ioctl(fd, FIONREAD, &bytes);
if (bytes >= 1)
{
bytes = read(fd, rBuf, 1);
if (bytes < 0)
return READ_ERR;
return SUCCEED;
}
else
return NO_DATA_AVAILABLE;
}
int Comm::Send(int xCt, unsigned char* xBuf)
{
int bytes;
if (fd == -1)
return FAIL;
bytes = write(fd, xBuf, xCt);
if (bytes != xCt)
return FAIL;
else
return SUCCEED;
}