C++ &引用;“串行传输完成”-中断RS485[BeagleBoneBlack-埃]

C++ &引用;“串行传输完成”-中断RS485[BeagleBoneBlack-埃],c++,linux,beagleboneblack,angstrom-linux,rs485,C++,Linux,Beagleboneblack,Angstrom Linux,Rs485,我正在BeagleBoneBlack上开发一个应用程序。嵌入式linux对我来说是全新的=/ 我面临的问题是我想实现RS485通信, 我使用SeriaLib库编写了一段C++代码,目前使用专用GPIO切换RS485接口的方向。到目前为止一切都很好 要编写消息,请在下面使用函数write write(fd,Message,Lenght); 唯一的问题是在总线上写入最后一个字节后立即切换方向引脚=( 在微控制器上开发时,对各种中断等做出反应是没有问题的 在内核深处,有什么解决方案可以在成功传输消息

我正在BeagleBoneBlack上开发一个应用程序。嵌入式linux对我来说是全新的=/

我面临的问题是我想实现RS485通信, 我使用SeriaLib库编写了一段C++代码,目前使用专用GPIO切换RS485接口的方向。到目前为止一切都很好

要编写消息,请在下面使用函数write

write(fd,Message,Lenght);
唯一的问题是在总线上写入最后一个字节后立即切换方向引脚=(

在微控制器上开发时,对各种中断等做出反应是没有问题的

在内核深处,有什么解决方案可以在成功传输消息后直接切换pin码吗?

通常在小型微控制器上,输入最后一个字符后,您可以启用传输完成中断,或者只是在发送例程中忙着等待传输完成标志,然后禁用驱动程序

然而,一些较重的MCU没有传输完全中断,多任务操作系统可能不喜欢繁忙的等待(如果在两次轮询之间让步,则会引入不期望的延迟)。我想到了两种处理方法

  • 由于您有一个要禁用的驱动程序,听起来好像您只有一个双向对,并且将接收您发送的所有内容。再加上一些状态跟踪,您可以使用接收中断来知道您的最后一个字符已发送,并禁用驱动程序。(如果其他人阻塞总线,也可以处理接收错误)

  • 确定从最后一个字符排队到传输完成的波特率相关时间,并为该时间量设置计时器中断,然后在ISR中禁用驱动程序


  • 很难说它是“嵌入式”的——你有一个完整的桌面操作系统!它只是和你以前使用的不同的硬件。@LightnessRacesinOrbit——你真的不知道那里安装了什么。如今,无数微小的、明显是“嵌入式”的设备都有linux内核(袖珍路由器、可以上传wifi的SD卡等),这是一个“完整的桌面操作系统”是否使用取决于未指定的用户空间。这个问题实际上归结为在硬件上使用多任务操作系统,该硬件可能支持也可能不支持传输完全中断。你好,Chris,您对单双向信号数据线的看法是正确的。它是一条2线RS485。您建议的要点(1)和(2)。(1)这可能是一个解决方案,但我不想在传输算法上花费太多的智慧这正是我现在正在做的事情-这不是一个合适的解决方案。我进一步的想法是:-使用UART1-RTS来启用收发器。我想这应该具有与方向引脚相同的效果。-->在我的应用程序中是否有一种方法来设置RTS状态?我真的必须知道完整消息传输的时间我建议你花些时间来计算状态逻辑,或者如果这太多,就构建一个硬件驱动程序超时。