串行端口上的第二次读取以规范模式返回换行符

时间:2019-01-27 04:09:03

标签: c linux serial-port usbserial

我了解串行端口的规范模式,读取将仅返回,直到输入队列遇到换行符为止。

我将两个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。

预期的行为是返回“测试”权限。在canonical_read.c中配置ttyUSB0时是否错过了任何设置

当我将缓冲区替换为

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

我得到正确的输出。

感谢您的帮助和时间

0 个答案:

没有答案