0

(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;
}
4

2 に答える 2

1

シリアルポートの喜びへようこそ...

考え 1: 読み取り呼び出しを select () でラップする

考え 2: tcsetattr で ICANON フラグを設定解除し、意図的なタイムアウトの VTIME 属性を設定します (そして、明らかに、それを処理します)

考え 3: シリアル通信で完全に機能するものはありません。

于 2013-12-07T04:36:23.070 に答える
0

コマンドをデバイスに送信し、デバイスからの応答を読み取る際にも同様の問題がありました。以下のSOF投稿と、これが私の問題に対して機能していた回答を参照してください。

このような場合、デバイス通信 (送受信) に使用するプロトコルに注意する必要があります。コマンドを正常に送信でき、デバイスからノイズのある応答を受信しなかった場合は、デバイスに送信されたデータ パケットに問題があることを意味します。まずはプロトコルの仕様を確認し、簡単なコマンド(ビープ音を鳴らすなど)のバイト配列を作成して送信します。

RS232シリアルポート経由でバーコードスキャナーにデータを送信

完全なソースコードを出力とともに投稿していただければ、私はあなたのために何かをすることができます。

コードをお楽しみください。ありがとう。

于 2014-04-17T06:26:44.443 に答える