Второе чтение по последовательному порту возвращает символ новой строки в каноническом режиме - PullRequest
0 голосов
/ 27 января 2019

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

Я подключил два PL2303 USB к последовательному устройству (TX -> RX, RX-> TX)

Написал два кода C, один для получения из / dev / ttyUSB0, а другой для записи из / dev / ttyUSB1

canonical_write.c:

#include <stdio.h>
#include <sys/types.h>
#include <termios.h>
#include <fcntl.h>
#include <stdlib.h>

#define SERIAL_DEVICE   "/dev/ttyUSB1"

int main()
{
    struct termios serial_port_settings;
    int fd;
    int retval;
    char buf[256] = "hello world \n test \n";
    char ch;
    int i;

    fd = open(SERIAL_DEVICE, O_RDWR);
    if (fd < 0) {
        perror("Failed to open SERIAL_DEVICE");
        exit(1);
    }

    retval = tcgetattr(fd, &serial_port_settings);
    if (retval < 0) {
        perror("Failed to get termios structure");
        exit(2);
    }

    //setting baud rate to B38400
    retval = cfsetospeed(&serial_port_settings, B38400);
    if (retval < 0) {
        perror("Failed to set 9600 output baud rate");
        exit(3);
    }
    retval = cfsetispeed(&serial_port_settings, B38400);
    if (retval < 0) {
        perror("Failed to set 9600 input baud rate");
        exit(4);
    }
    serial_port_settings.c_lflag |= ICANON; 
    retval = tcsetattr(fd, TCSANOW, &serial_port_settings);
    if (retval < 0) {
        perror("Failed to set serial attributes");
        exit(5);
    }
    printf("Successfully set the baud rate\n");
    for (i = 0; buf[i] != '\0'; i++) {
        ch = buf[i];
        printf("Writing character :%c ASCII:%d\n", ch, ch);
        retval = write(fd, &ch, sizeof(ch));
        if (retval < 0) {
            perror("write on SERIAL_DEVICE failed");
            exit(6);
        }
        sleep(1);
    }
    close(fd);
    return 0;
}

canonical_read.c

#include <stdio.h>
#include <sys/types.h>
#include <termios.h>
#include <fcntl.h>
#include <stdlib.h>

#define SERIAL_DEVICE   "/dev/ttyUSB0"

int main()
{
    struct termios serial_port_settings;
    int fd;
    int retval;
    char buf[256];
    int i, loop = 2;

    fd = open(SERIAL_DEVICE, O_RDWR);
    if (fd < 0) {
        perror("Failed to open SERIAL_DEVICE");
        exit(1);
    }

    retval = tcgetattr(fd, &serial_port_settings);
    if (retval < 0) {
        perror("Failed to get termios structure");
        exit(2);
    }

    //setting baud rate to B38400
    retval = cfsetospeed(&serial_port_settings, B38400);
    if (retval < 0) {
        perror("Failed to set 9600 output baud rate");
        exit(3);
    }
    retval = cfsetispeed(&serial_port_settings, B38400);
    if (retval < 0) {
        perror("Failed to set 9600 input baud rate");
        exit(4);
    }
    serial_port_settings.c_lflag |= ICANON; 
    //Disable ECHO
    serial_port_settings.c_lflag &= ~(ECHO | ECHOE);
    retval = tcsetattr(fd, TCSANOW, &serial_port_settings);
    if (retval < 0) {
        perror("Failed to set serial attributes");
        exit(5);
    }
    printf("Successfully set the baud rate\n");
    while (loop--) {
        retval = read(fd, buf, sizeof(buf));
        if (retval < 0) {
            perror("Read on SERIAL_DEVICE failed");
            exit(6);
        }
        printf("Read returned %d bytes\n", retval);
        for (i = 0; i < retval; i++) {
            printf("Read Character:%c \t ASCII:%d\n", buf[i], buf[i]);
        }
    }
    close(fd);
    return 0;
}

При запуске обеих программ первое чтение успешно возвращает «hello world», а второе чтение возвращает «\ n» ASCII 10.

Ожидаемое поведение:вернуть «тест» правильно.Я пропустил какие-либо настройки при настройке ttyUSB0 в canonical_read.c

Когда я заменяю буфер на

char buf[256] = "hello world \r test \n";

, я получаю правильный вывод.

Спасибо за вашу помощь ивремя

...