我正在尝试在 Linux(Ubuntu 12.04)中读取和写入串行端口,其中另一端的微控制器在完成特定任务时会爆炸 1 或 3 个字节。我能够成功读取和写入设备,但问题是我的读取现在有点“危险”:
do
{
nbytes = read(fd, buffer, sizeof(buffer));
usleep(50000);
} while(nbytes == -1);
即简单地监视设备发送给我的内容,我每半秒轮询一次缓冲区。如果为空,则在此循环中空闲。如果它收到一些东西或错误,它就会退出。然后一些逻辑处理 1 或 3 个数据包并将其打印到终端。半秒通常是一个足够长的窗口,可以让某些东西完全出现在缓冲区中,但对于最终会看到它的人来说,它足够快,不会认为它很慢。
“通常”是关键词。如果我读取中间的缓冲区爆破 3 个字节。我会读得很糟糕;缓冲区中将包含 1 或 2 个字节,它会在数据包处理中被拒绝(如果我捕获 3 字节数据包中的第一个,它不会是有目的地发送一个字节的值)。
我考虑过/尝试过的解决方案:
我想过一次简单地读取一个字节,如果它是 3 字节传输的一部分,则输入额外的字节。但是,这会产生一些丑陋的循环(因为 read() 只返回仅返回最近一次读取的字节数),如果可以的话,我想避免这些循环
我试图读取 0 个字节(例如 nbytes = read(fd, buffer, 0);)只是为了查看缓冲区中当前有多少字节,然后再尝试将其加载到我自己的缓冲区中,但正如我所怀疑的那样返回 0。
如果我可以在将端口缓冲区的内容加载到我自己的缓冲区之前查看端口缓冲区的内容,那么我的很多问题似乎都会很容易解决。但是 read() 的破坏性取决于您告诉它读取的字节数。
我怎样才能从这个缓冲区中读取数据,这样我就不会在接收传输的过程中这样做,但要足够快以至于不会让用户觉得慢?我的串行信使分为发送者和接收者线程,所以我不必担心我的程序循环阻塞某处而忽略另一半。
谢谢你的帮助。