【发布时间】:2018-08-04 07:46:32
【问题描述】:
我正在尝试通过 UART 在两个 Linux 系统之间进行通信。 我想发送大量数据。使用指定的 Baudrate 大约需要 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;
}
【问题讨论】:
标签: linux performance system-calls uart baud-rate