当前位置: 首页 > 知识库问答 >
问题:

在c语言中通过串口传输时,字符\r转换为\n

昝浩阔
2023-03-14

我只使用写函数通过串口传输数据。出于某种原因,当我接收回此数据时\r(0x0d)将转换为\n(0x0a)。这可能是由于我在打开端口时使用了termios选项,但我不知道我可以改变什么。

对于一些额外的上下文:我使用2个arduinos通过串行端口传输数据,RX0连接到TX0,TX0连接到RX0。我也在短路。基本上,我使用arduinos来分离TX和RX信号,我并没有真正使用真正的arduino芯片或任何东西。

我正在为接收缓冲区和传输缓冲区分配适当的内存

#include <termios.h>
#include <fcntl.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
int serialport_init(const char* serialport, int baud) {
    struct termios toptions;
    int fd;
    fd = open(serialport, O_RDWR | O_NONBLOCK);

    if (fd == -1) {
        return -1;
    }

    if (tcgetattr(fd, &toptions) < 0) {
        return -1;
    }
    speed_t brate = baud;
    brate = B115200;
    cfsetispeed(&toptions, brate);
    cfsetospeed(&toptions, brate);

    // 8N1 - * bits no parity
    toptions.c_cflag &= ~PARENB;
    toptions.c_cflag &= ~CSTOPB;
    toptions.c_cflag &= ~CSIZE;
    toptions.c_cflag |= CS8;

    toptions.c_cflag |= CREAD | CLOCAL;  // turn on READ & ignore ctrl lines
    toptions.c_iflag &= ~(IXON | IXOFF | IXANY);  // turn off s/w flow ctrl

    toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);  // make raw
    toptions.c_oflag &= ~OPOST;                           // make raw

    toptions.c_cc[VMIN] = 0;
    toptions.c_cc[VTIME] = 0;

    tcsetattr(fd, TCSANOW, &toptions);
    if (tcsetattr(fd, TCSAFLUSH, &toptions) < 0) {
        return -1;
    }

    return fd;
}


int serialport_write_bytes(int fd, const uint8_t* bytes, size_t n_bytes) {
    ssize_t n;
    size_t bytes_written = 0;

    while (bytes_written < (size_t)n_bytes) {
        n = write(fd, &bytes[bytes_written], n_bytes - bytes_written);
        if (n == -1) continue;
        if (n == 0) {
            continue;
        }
        bytes_written += n;
        printf("wrote total of: %ld bytes n=%ld\n", bytes_written, n);
        tcflush(fd, TCIOFLUSH);  // Flush port - same result if not used
        usleep(10 * 1000);       // wait 1 msec try again. Maybe can remove
    }
    printf("Total bytes written: %ld\n", bytes_written);
    return 0;
}


int serialport_read_bytes(int fd, uint8_t* buf, int n_bytes, int millis) {
    ssize_t n;
    size_t bytes_read = 0;

    while (bytes_read < (size_t)n_bytes) {
        n = read(fd, &buf[bytes_read], n_bytes - bytes_read);
        if (n == -1) return -1;  // couldn't read
        if (n == 0) {
            usleep(millis * 1000);  // wait 1 msec try again
            continue;
        }
        printf("read total: %ld bytes\n", bytes_read);
        bytes_read += n;
    }
    printf("Total bytes read: %ld\n", bytes_read);
    return 0;
}

共有1个答案

弓举
2023-03-14

我认为您需要取消ICRNL标志以及。

参见https://viewsourcecode.org/snaptoken/kilo/02.enteringrawmode.html#fix-ctrl-m

toptions.c_iflag &= ~ICRNL;
 类似资料:
  • 我有一根绳子, 我想把它转换成一个字节数组。 有人能在这方面引导我吗?我尝试了以下代码,但我得到了ASCII中的数据。我不想那样。

  • 主要内容:适用于字符串构造的规则,字符串操作在R中的单引号或双引号中写入的任何值都将被视为字符串。在R内部将每个字符串存储在双引号内,即使您使用单引号创建它们。 适用于字符串构造的规则 字符串开头和结尾的引号应为双引号或双引号,他们不能混合。 双引号可以插入到以单引号开始和结尾的字符串中。 单引号可以插入到以双引号开始和结尾的字符串中。 双引号不能插入到以双引号开始和结尾的字符串中。 单引号无法插入到以单引号开始和结尾的字符串中。 有效字符

  • 在x86汇编语言中,是否有任何有效的方法将字节转换为二进制数字字符串(表示为0和1的字节数组)?据我所知,x86汇编中没有任何“toString”函数,就像大多数高级编程语言一样。

  • 本文向大家介绍C语言中时间戳转换成时间字符串的方法,包括了C语言中时间戳转换成时间字符串的方法的使用技巧和注意事项,需要的朋友参考一下 在PE格式里有个字段是文件的创建时间戳,我想把转成字符串,这样看的更直观。 以上所述是小编给大家介绍的C语言中时间戳转换成时间字符串的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

  • 问题内容: 我试图将dispatch_queue_create与我在运行时创建的动态字符串一起用作第一个参数。编译器抱怨,因为它期望使用标准的c字符串。如果我将其切换为编译时定义的字符串,错误就会消失。谁能告诉我如何将String转换为标准c字符串? 问题答案: 您可以得到如下: 编辑: Beta 5更新- 不再存在(感谢@Sam):

  • 本文向大家介绍C语言实现将字符串转换为数字的方法,包括了C语言实现将字符串转换为数字的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C语言实现将字符串转换为数字的方法。分享给大家供大家参考。具体实现方法如下: C语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)的数字。以下是用atoi()函数将字符串转换为整数的一个例子:   atoi()函数只有一个参数