【问题标题】:C UART not working all the timeC UART一直不工作
【发布时间】:2017-11-15 00:34:52
【问题描述】:

我在将串行设备连接到我正在为其编写代码的嵌入式设备时遇到问题。

我正在编写的设备有两个串行端口,一个从我的笔记本电脑输入,一个输出到外部设备。

当我将两个终端连接到我的笔记本电脑并查看数据时,我得到的正是我所期望的数据。

当我将笔记本电脑直接连接到外部设备时,我得到的正是我所期望的,并且得到了响应。

当我将笔记本电脑和外部设备连接到我正在使用的嵌入式设备时,笔记本电脑会向它发送数据、接收数据,然后将其传递给外部设备。这按预期工作。

但是,外部设备不会发回响应。

如果我从嵌入式设备向外部设备发送数据,我发送的每条新消息都允许它发送原始回复。

我知道第一条消息是正确通过的,因为外部设备会发出嗡嗡声,我知道它何时通过在 tx/rx 通信上运行逻辑分析器并查看流量来发送响应。

我认为嵌入式设备持有 rx 线并阻止其传输,但我看不出在代码中这是怎么可能的。此外,如果是这种情况,当我将两条线都插入笔记本电脑时,它不应该工作。

我也认为 DTR 没有设置高,但检查了这个,它似乎设置得很高。

有人知道导致设备无法响应的原因吗?

注意:当我说串行端口时,我指的是嵌入式设备时的 UART。所有设备都使用运行 RS232 的 DB9 连接器。

编辑:笔记本电脑的操作系统是 Windows 10。嵌入式设备是 Atmega324p。

编辑 2:进行了更多测试。它似乎有时有效,有时无效。

我添加了一张显示响应信号几乎完美的图像。

蓝色部分是信号中不应该存在的间隙。

【问题讨论】:

  • C语言没有串口库。您应该首先指定您使用的操作系统。例如,与 POSIX 兼容的操作系统将使用 <termios.h> 标头。
  • 操作系统?什么是操作系统?他说嵌入式设备。听起来您必须为此打开示波器。首先,弄清楚你是否真的在发送到外部设备——不仅仅是你的代码说它发送了一些东西,而是信号确实发生了。如果您有来自嵌入式设备的第三个输出通道用于调试,它也很方便。可能是第三个 UART,或者可能将调试信息写入闪存,以便在运行后读取。
  • @Julien-L 更新了我的问题,以反映一些关于 UART 而不是串行端口的更具体的问题。
  • @Lee Daniel Crocker 我使用的是 Salae 逻辑分析仪而不是示波器,因此我可以直接查看信号。嵌入式设备向外部设备发送“初始化”消息。外部设备不会向嵌入式设备回复“Ack + MSG”。除了,有时确实如此。有时它只是发送“Ack + MSG”的一部分
  • 我们不知道您使用的是什么代码,我们不知道什么 OS/RTOS/whatever。我们不知道什么硬件 我们不知道您使用的是什么串行协议。你建议我们做什么?

标签: c serial-port embedded uart


【解决方案1】:

最终找到了解决方案。

RTS 线路通过嵌入式设备保持在 1.2v,而 PC 保持在 5.2v。

将 RTS 线路拉到 5v 解决了这个问题。

【讨论】:

  • 把它拉起来听起来很冒险——你应该弄清楚为什么它是 1.2v。用于此的 I/O 引脚的逻辑电平是多少?它实际上是否配置为推/拉驱动输出?
猜你喜欢
  • 2014-12-14
  • 2018-06-20
  • 1970-01-01
  • 2015-04-15
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
相关资源
最近更新 更多