gpt4 book ai didi

Linux UART 比指定的波特率慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:03 33 4
gpt4 key购买 nike

我正在尝试通过 UART 在两个 Linux 系统之间进行通信。我想发送大块数据。使用指定的波特率,它应该需要大约 5 秒,但它花费的时间几乎是预期时间的 10 倍。

由于我发送的内容超出了缓冲区一次可以处理的范围,所以它被分成小部分发送,我正在耗尽中间的缓冲区。如果我测量耗尽所需的时间和写入缓冲区的字节数,我计算出的波特率比指定的波特率低近 10 倍。

我希望较慢的传输速度是最佳选择,但不是那么多。

我在设置 UART 或写入时是否遗漏了什么?还是这是正常的?

用于设置的代码:

int bus = open(interface.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); // <- also tryed blocking
if (bus < 0) {
return;
}

struct termios options;
memset (&options, 0, sizeof options);
if(tcgetattr(bus, &options) != 0){
close(bus);
bus = -1;
return;
}
cfsetspeed (&options, B230400);
cfmakeraw(&options); // <- also tried this manually. did not make a difference
if(tcsetattr(bus, TCSANOW, &options) != 0)
{
close(bus);
bus = -1;
return;
}
tcflush(bus, TCIFLUSH);

用于发送的代码:

int32_t res = write(bus, data, dataLength);
while (res < dataLength){
tcdrain(bus); // <- taking way longer than expected
int32_t r = write(bus, &data[res], dataLength - res);
if(r == 0)
break;
if(r == -1){
break;
}
res += r;
}

最佳答案

B230400

文档是矛盾的。 cfsetspeed 被记录为需要 speed_t 类型,而该注释说您需要使用“B”常量之一,如“B230400”。您是否尝试过使用实际的 speed_t 类型?

在任何情况下,您提供的速度是波特率,在这种情况下,假设没有节流,波特率应该约为 23,000 字节/秒。

速度取决于硬件和链接限制。串行协议(protocol)也允许暂停传输。

FWIW,根据您列出的时间和速度,如果一切正常,您将在 50 秒内获得大约 1 MB。您实际获得的速度是多少?

另一个“也”是选项结构。自从我不得不做任何串行 I/O 以来已经有好几年了,但是 IIRC,你需要实际设置你想要的选项并得到你的硬件的支持,比如 CTS/RTS、XON/XOFF 等。

This might be helpful .

关于Linux UART 比指定的波特率慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51674036/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com