【问题标题】:Capture a custom UART like signal捕获自定义 UART 类信号
【发布时间】:2018-01-25 10:45:16
【问题描述】:

我正在尝试捕获类似于 UART 通信的信号。

这个特定的信号由以下组成:

1 个起始位(低)

16 个数据位

1 个停止位(高)

通过测试,我发现信号约为 ~8-9μs/bit。这让我相信波特率大约是 115.2kbps。

我的第一个想法是尝试“手动”方法,并编写了一个小型 C 程序。虽然我无法在适当的时间对信号进行采样。

从这里开始,我决定寻找可以完成这项工作的库。我确实尝试过 boost 中的“termios”和“asio::serial_port”,但它们似乎无法接收 16 位字符。

我尝试配置 16 位接收器是不是太天真了? “16 位 UART”还有意义吗?

谢谢!

-nls

【问题讨论】:

  • 大多数 UART 不支持 16 位数据 - 您可能需要在所使用的任何硬件上使用通用 I/O 线,并从头开始实现软件 UART。
  • 也许使用简单的 uC 控制器开发板进行时间关键型转换。在这里,您应该能够在软件中实现您的 16 位 UART。更多信息请查看mikrocontroller.net/topic/85900
  • 你可以通过 "bit-banging" 在 Arduino 上轻松地完成这类事情,参见arduino.cc/en/Reference/SoftwareSerialarduiniana.org/libraries/newsoftserial 以及关于 SPI 的这个而不是 RS232,而是向您展示了这项技术。
  • 我尝试使用带有 Atmega328 的 Arduino 板,但不确定端口操作是否足够快以达到 115.2kbps,并切换到 Raspberry Pi。我会更深入地阅读“bit-banging”。

标签: c++ c signal-processing uart


【解决方案1】:

支持 16 位数据位配置的 UART 的想法从根本上来说并没有错,但我不知道有什么问题。 8 或 9 通常是极限。

如果您正在与仅支持该配置的设备进行通信(这到底是什么设备?),您唯一真正的选择是 bit-banging,最好由专用于该目的的 MCU 来完成。无论您使用什么库,您都不会在多任务操作系统上的用户空间中获得微秒级精度的计时。

编辑:请注意,您可以或多或少地通过专用内核空间驱动程序的位撞击来做到这一点。但这会使系统几乎无法使用。 UART 存在的全部原因是因为 CPU 有比每隔几微秒轮询一次线路更好的事情要做。

【讨论】:

  • 我完全理解。在这种情况下,我试图窥探 GameBoy Advance 链接电缆协议。据我了解,此通信协议可用于与 2-4 个设备交换信号。我将尝试实现一个有点敲击的解决方案并研究专用的内核空间。非常感谢!
猜你喜欢
  • 2012-06-24
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
相关资源
最近更新 更多