gpt4 book ai didi

c - Linux 多线程程序中的串口读取

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

我正在 linux 中编写一个程序,通过串口与一个硬件进行交互。该设备以大约 10Hz 的频率发送大约 30-40 字节的数据包。该软件模块将与其他软件模块交互并通过 IPC 进行通信,因此它必须执行特定的 IPC sleep ,以允许它在没有做任何有用的事情时接收它订阅的消息。

目前我的代码看起来像这样:

while(1){
IPC_sleep(some_time);
read_serial();
process_serial_data();
}

这样做的问题是,有时读取会在串行端口上只有下一个数据包的一小部分可用时执行,这意味着直到下一次循环时才会全部读取。对于特定的应用程序,最好在数据可用时立即读取数据,并且程序在读取时不会阻塞。

这个问题的最佳解决方案是什么?

最佳答案

最好的办法就是不 sleep !我的意思是一个好的解决方案可能是混合IPC 事件和串行事件。 select 是执行此操作的好工具。然后你必须找到和选择兼容的IPC机制。

  • 基于套接字的 IPC select() 能够
  • 基于管道的 IPC select() 能够
  • posix 消息队列也是可选的

然后你的循环看起来像这样

while(1) {
select(serial_fd | ipc_fd); //of course this is pseudo code
if(FD_ISSET(fd_set, serial_fd)) {
parse_serial(serial_fd, serial_context);
if(complete_serial_message)
process_serial_data(serial_context)
}
if(FD_ISSET(ipc_fd)) {
do_ipc();
}
}

read_serial 替换为 parse_serial,因为如果您将所有时间都花在等待完整的串行数据包上,那么选择的所有好处都会丢失。但是从你的问题来看,你似乎已经在这样做了,因为你提到在两个不同的循环中获取串行数据。
使用建议的体系结构,您在 IPC 和串行端都具有良好的 react 性。您可以在串行数据可用时立即读取它们,而无需停止处理 IPC。

当然,它假定您可以更改 IPC 机制。如果你做不到,也许你可以做一个“桥接过程”,一方面与你遇到的任何 IPC 接口(interface),另一方面使用 select()able IPC 进行通信你的序列号。

关于c - Linux 多线程程序中的串口读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5300362/

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