gpt4 book ai didi

c++ - 序列号 : write() throttling?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:02 25 4
gpt4 key购买 nike

我正在开发一个项目,发送串行数据来控制 LED 灯的动画,这需要与动画引擎保持同步。似乎有一个大的串行写入缓冲区(OSX(POSIX)+ FTDI 芯片组 USB 串行设备),因此无需手动限制对 write() 的调用,软件可以提前几秒钟启动。

目前我手动将串行写入速度限制为波特率(8N1 = 每 8 字节数据 10 字节串行帧,19200 bps 串行 -> 每秒最大 1920 字节),但我遇到了动画漂移的问题随着时间的推移与灯光不同步 - 开始时很好,但 10 分钟后动画和灯光之间出现明显的(100 毫秒以上)延迟。

这是限制串行写入速度的代码(每个动画帧调用一次,'elapsed' 是当前帧的持续时间,'baudrate' 是 bps (19200)):

void BufferedSerial::update( float elapsed )
{
baud_timer += elapsed;

if ( bytes_written > 1024 )
{
// maintain baudrate
float time_should_have_taken = (float(bytes_written)*10)/float(baudrate);
float time_actually_took = baud_timer;
// sleep if we have > 20ms lag between serial transmit and our write calls
if ( time_should_have_taken-time_actually_took > 0.02f )
{
float sleep_time = time_should_have_taken - time_actually_took;
int sleep_time_us = sleep_time*1000.0f*1000.0f;
//printf("BufferedSerial::update sleeping %i ms\n", sleep_time_us/1000 );
delayUs( sleep_time_us );

// subtract 128 bytes
bytes_written -= 128;
// subtract the time it should have taken to write 128 bytes
baud_timer -= (float(128)*10)/float(baudrate);
}
}
}

显然某处出了问题。

更好的方法是能够确定当前传输队列中的字节数,并尝试将其保持在固定阈值以下,但我不知道如何在 OSX (POSIX) 上执行此操作) 系统。

感谢任何建议。

最佳答案

如果你想放慢你的动画以匹配你可以写入 LED 的最大速度,你可以只使用 tcdrain();像这样:

while (1)
{
write(serial_fd, led_command);
animate_frame();
tcdrain(serial_fd);
}

关于c++ - 序列号 : write() throttling?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2892096/

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