2

次のコードを使用して送信プログラムと受信プログラムをテストしています

main() 関数は以下のとおりです。

#include "lib.h"

int fd;

int initport(int fd) {
    struct termios options;
    // Get the current options for the port...
    tcgetattr(fd, &options);
    // Set the baud rates to 19200...
    cfsetispeed(&options, B9600);
    cfsetospeed(&options, B9600);
    // 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);
    return 1;
}

int main(int argc, char **argv) {

    fd = open("/dev/pts/2", O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd == -1) {
        perror("open_port: Unable to open /dev/pts/1 - ");
        return 1;
    } else {
        fcntl(fd, F_SETFL, 0);
    }

    printf("baud=%d\n", getbaud(fd));
    initport(fd);
    printf("baud=%d\n", getbaud(fd));

    char sCmd[254];
    sCmd[0] = 0x41;
    sCmd[1] = 0x42;
    sCmd[2] = 0x43;
    sCmd[3] = 0x00;

    if (!writeport(fd, sCmd)) {
        printf("write failed\n");
        close(fd);
        return 1;
    }

    printf("written:%s\n", sCmd);

    usleep(500000);
    char sResult[254];
    fcntl(fd, F_SETFL, FNDELAY); 

    if (!readport(fd,sResult)) {
        printf("read failed\n");
        close(fd);
        return 1;
    }
    printf("readport=%s\n", sResult);
    close(fd);
    return 0;
}


lib.h には、次のような読み取りおよび書き込みコードが含まれています。

Cでデータフレームを解析して読み取りますか?

問題が発生しました:

シリアル ポートでテストするために、socat ( https://help.ubuntu.com/community/VirtualSerialPort ) を使用して Linux でシリアル ポートのペアを作成し、これらのポートでプログラムをテストしました。

プログラムが最初にデータを送信し、プログラムがデータを受信したときは問題ありません。ただし、シリアルポートに新しいデータを再度読み取ったり、書き直したりすると、仮想シリアルポートを停止して再度開始するまで、戻りデータは常にnullになります。その後、書き込みおよび読み取りデータは問題ありませんが、それでも、一度。

(実際には、送信部分は別のデバイスによって行われます。シリアルポートからの読み取りデータを処理しているだけです。読み取りコードをテストするためだけに両方の部分を書きました。)

誰にもアイデアはありますか?

4

1 に答える 1

1

コメントまたはコードのいずれかが間違っています:

// Set the baud rates to 19200... 
cfsetispeed(&options, B9600); 
cfsetospeed(&options, B9600); 

これは、ボーレートを19200に設定することを示していますが、実際には9600に設定されています。

// Set the baud rates to 19200... 
cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
于 2010-03-28T05:24:37.817 に答える