2

シリアル ポートから読み取る 2 つのプログラムがあり、もう一方の端にデバイスが接続されています。最初のプログラムは Qt フレームワークを使用して作成され、QextSerialPort を使用してシリアルと通信します。2 番目のプログラムは純粋な C で書かれています。

問題は次のようなものです:

システムの起動直後、純粋な C プログラムはシリアルからのデータの読み取りに問題があります。pselect (serial_fd を監視している) が serial_fd で戻ってデバイスからデータを読み取ることはありませんが、デバイスがデータに反応するため、データが適切に送信されることがわかっています。

2 番目のプログラム (Qt で記述) を開始すると、すぐにデバイスからデータを送受信しますが、問題ありません。

さらに、Qt プログラムを開始してから純粋な C プログラムを開始した後、システムを再起動するまで、純粋な C が突然問題なく動作します。Qt で書かれたプログラムは、初期化中にシリアル ポートの設定を永続的に変更するように見えますが、これは可能ですか?

以下は、シリアル ポートを初期化する Qt プログラムのコード スニペットです。

if (rs232->open(QIODevice::ReadWrite)) {
    rs232->setBaudRate(BAUD38400);
    rs232->setFlowControl(FLOW_OFF);
    rs232->setParity(PAR_NONE);
    rs232->setDataBits(DATA_8);
    rs232->setStopBits(STOP_1);
    connect(rs232, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
} else {
    qDebug() << "Rs232::rs232Connect OPEN PORT FAILURE";
    exit(1);
}

そして、これは純粋なCプログラムからのものです:

fd = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY);

if (fd == -1) {
/*
* Could not open the port.
*/
    error_exit(ERROR,"open_port: Unable to open /dev/ttyAMA0");
}
else
    fcntl(fd, F_SETFL, 0);

/*
 * Get the current options for the port...
 */

tcgetattr(fd, &options);

/*
 * Set the baud rates to 19200...
 */

cfsetispeed(&options, B38400);
cfsetospeed(&options, B38400);

/*
 * Enable the receiver and set local mode...
 */

options.c_cflag |= (CLOCAL | CREAD);

options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;

/*
 * Set the new options for the port...
 */

tcsetattr(fd, TCSANOW, &options);

何か足りないものはありますか?

よろしくマレク

4

1 に答える 1

0

ここでストローをつかんでいますが、他のことをする前に、別の端末を反対側に接続して、何かが起こっているかどうかを確認することをお勧めします. あなたの問題は、C アプリケーションでフロー制御モードを設定していないという事実かもしれません。

options.c_cflag &= ~CRTSCTS;

それでもうまくいかない場合は、ここで受け入れられた回答を見てください。過去にこのコードを数回使用しましたが、シリアル通信で問題が発生したことはありません。

于 2014-01-30T13:55:04.813 に答える