【问题标题】:Upload Arduino code on virtual serial port through Arduino IDE通过 Arduino IDE 在虚拟串口上上传 Arduino 代码
【发布时间】:2013-04-03 10:37:36
【问题描述】:

我下载了几个提供虚拟 COM 端口的软件。这些 COM 端口确实出现在 Device Manager 中,并且可以从 Arduino IDE 菜单工具 -> 串行端口 -> COM3 中选择上传。它开始上传并达到 90%,然后它要么超时,要么什么都不做。

我想上传到虚拟 COM 端口,这样我就可以在另一个程序中读取编译输出文件。我根本不想使用我的 Arduino,也不想在上传时手动获取详细的输出文件。当我在真正的 Arduino 上上传时,不会发生此问题。

应用程序应该可以在所有平台上运行。这项任务在 Linux 上似乎很容易,而我在 Windows 上面临着上述问题,任何有关 Mac 的帮助也会很有用。

该应用程序将成为硬件模拟和可视化的教育工具,旨在为用户提供比其他模拟器更多的动手体验。因此,这可能会让您了解我为什么要这样做。

我该如何开始?

【问题讨论】:

  • 如果要抓取编译后的程序(即原始机器码),为什么不直接查看生成的 Intel Hex 文件?
  • 两个原因,首先,如果您像使用实际的 Arduino 一样打开 IDE 并上传代码,将会有更好的用户体验。其次,根据我的理解,.hex 文件的路径发生了变化,因此在我的应用程序中使用它并不容易。

标签: serial-port arduino virtual bootloader


【解决方案1】:

我想您可能会假设将代码上传到 Arduino 是一种单向通信:这就像将草莓放入搅拌机中,然后出现 Daquiri。如果这是真的,您可以将 IDE 转储到串行端口的任何内容保存到文件中,然后您就有了一个 Arduino 二进制文件。 (如果对细节不感兴趣,请跳至 TL;DR。结果:这个假设不正确)。

单向通信假设并不完全正确:Arduino上有一个程序(称为“abootloader”)负责与程序员进行通信(“programmer”:对Arduino进行编程的程序,假设它现在是 Arduino IDE)。在最“自然”的状态下,Arduino CPU 无法跨串行线路进行编程。相反,这些芯片通过system programming (ISP) 或via JTAG 协议进行编程。引导加载程序是在 Arduino CPU 上运行并通过串行端口加载草图/程序的程序。该程序在启动时运行,并通过串行端口查找编程命令。

如果它发现程序员正在尝试传递编程信息,它将读取来自串行链路的已编译 Arduino 二进制文件,将其存储在闪存中,通过串行链路将其发送回以进行验证,如果一切正常成功,退出并启动存储的草图。如果串口上没有出现编程信息,也就是说,没有程序员在尝试编写新的草图,那么引导加载程序会简单地退出并启动已经存储在闪存中的程序。

TL;DR:为了在您的串行端口上实现一个伪 Arduino,您必须编写一些程序来模拟虚拟串行端口另一端的 Arduino(引导加载程序)。因此,当程序员/IDE 对 Arduino 说“你在吗?”时你的程序会回答“是的!”,就像 Arduino 一样。

默认的 Arduino 引导加载程序是 STK-500 compatible:这意味着它实现了 STK-500 命令 - 可以找到 here 的参考。如果您决定这样做,那么最简单的方法可能是从现有的引导加载程序开始,例如 Arduino's 或 AdaFruit's(还有其他),然后对其进行修改。这样的引导加载程序应该已经实现了所有命令,并且由于它是用 C 编写的(我不会选择程序集引导加载程序来修改:),所以修改起来应该很容易。

或者,您可能会认为 STK-500 难以实施。如果是这种情况,您可以使用Avrdude 支持的任何编程器协议:Avrdude 是用于编程 AVR 芯片的程序,而 Arduino IDE 内部使用 Avrdude 将草图发送到 Arduino。如果您这样做,那么您必须更改您正在使用的程序员的 Arduino IDE 中的设置。

我个人认为兼容 STK-500 是最好的选择,但是YMMV。

【讨论】:

  • 非常感谢,这是非常有帮助和有见地的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多