Serial port 通过Arduino IDE在虚拟串口上传Arduino代码

Serial port 通过Arduino IDE在虚拟串口上传Arduino代码,serial-port,arduino,virtual,bootloader,Serial Port,Arduino,Virtual,Bootloader,我下载了几个提供虚拟COM端口的软件。这些COM端口确实出现在中,并且可以从Arduino IDE菜单工具->串行端口->COM3中选择上载。它开始上传并达到90%,然后它要么超时,要么什么都不做 我想上传到虚拟COM端口,这样我就可以在另一个程序中读取编译输出文件。我根本不想使用我的Arduino,也不想在上传时手动获取详细的输出文件。当我上传到真正的Arduino上时,这个问题不会发生 该应用程序应能在所有平台上运行。这项任务在Linux上似乎很容易,我在Windows上面临着这个问题,任何

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

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

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

该应用程序将成为硬件模拟和可视化的教育工具,试图为用户提供比其他模拟器更多的实际操作体验。也许这会让你明白我为什么要这么做


我该如何开始呢?

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

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

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

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

默认的Arduino引导加载程序是:这意味着它实现STK-500命令-可以找到其参考。如果您决定这样做,那么最简单的事情可能是从现有的引导加载程序开始,比如's或's(还有其他的),然后修改它。这样的引导加载程序应该已经实现了所有命令,而且因为它是用C编写的(我不会选择要修改的程序集引导加载程序:),所以修改它应该很容易

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


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

如果你想获取编译后的程序(即原始机器代码),为什么不看看生成的英特尔十六进制文件呢?原因有两个,首先,如果你像使用实际的Arduino一样打开IDE并上传代码,用户体验会更好。其次,据我所知,.hex文件的路径发生了变化,因此在我的应用程序中使用它并不容易。非常感谢,这是非常有帮助和深刻的。