Очистить данные на последовательном порту в Linux в C? - PullRequest
2 голосов
/ 28 марта 2010

Я тестирую программы отправки и получения с кодом

Функция 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 и протестировать мою программу с этими портами.

В первый раз, когда программа отправляет данные и программа получает данные, все в порядке. Тем не менее, если я снова читаю или даже перезаписываю новые данные в последовательный порт, возвращаемые данные всегда будут нулевыми, пока я не остановлю виртуальный последовательный порт и не начну его снова, тогда запись и чтение данных будут в порядке, но все же только один раз.

(В действительности, отправляющая часть будет выполняться другим устройством, я просто занимаюсь чтением данных с последовательного порта. Я написал обе части только для того, чтобы проверить мой код чтения.)

У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 28 марта 2010

Ваш комментарий или код неверен:

// 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...