【问题标题】:"Serial transmit complete"-Interrupt RS485 [BeagleBoneBlack - Angstrom]“串行传输完成”-中断 RS485 [BeagleBoneBlack - Angstrom]
【发布时间】:2014-02-04 04:08:40
【问题描述】:

我正在 BeagleBoneBlack 上开发应用程序。嵌入式 linux 对我来说很新 =/

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

下面使用函数write来写消息

write(fd,Message,Lenght);

唯一的问题是在最后一个字节写入总线后立即切换 DIRECTION-Pin =(

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

是否有任何解决方案 - 深入内核? - 成功传输消息后直接切换引脚?

【问题讨论】:

  • 好吧,它几乎不是“嵌入式”的——你有一个完整的桌面操作系统!它只是 与您习惯的硬件不同
  • @LightnessRacesinOrbit - 你真的不知道那里有什么安装。不计其数的微型、明显“嵌入式”的设备现在都有 linux 内核(袖珍路由器、进行 wifi 上传的 SD 卡等),是否是“完整的桌面操作系统”取决于 未指定用户空间。这个问题实际上归结为在可能支持或不支持传输完成中断的硬件上使用多任务操作系统。

标签: c++ linux beagleboneblack angstrom-linux rs485


【解决方案1】:

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

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

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

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

【讨论】:

  • 你好克里斯,你是对的单双向信号数据线。它是一个 2 线 RS485。到您建议的点(1)和(2)。 (1) 可能是一个解决方案,但我不想在传输算法上花费太多的智能。 (2) 这正是我现在正在做的事情——这不是一个合适的解决方案。我进一步的想法是: - 使用 UART1-RTS 来启用收发器。我想这应该具有与 DIRECTION-PIN 相同的效果。 --> 我的应用程序中有 RTS 状态的方法吗?我真的要知道一个完整的消息传输的时间。
  • 我建议你花点时间来解决状态逻辑,或者如果太多的话构建硬件驱动程序超时。
猜你喜欢
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 2017-07-21
  • 2018-11-13
  • 2019-02-05
相关资源
最近更新 更多