通过串行实现MCU的控制命令


8

我希望将命令界面集成到一个项目中,该项目使我可以接受来自PC的命令。

这个想法是设备将执行其操作,但会收到命令,它将执行该命令。这与我设法找到的大多数示例不同,这只是一个等待串行数据的空闲设备。

因此,例如,一个控制LED并播放动画的设备。假设有3个预设动画,当它打开时,它始终播放数字1。在PC端,我将发送命令“播放预设2”,或“将颜色更改为绿色”,或向设备发送实时实时动画在LED上播放。

所以我的问题是我找不到关于这种“设计模式”的太多信息吗?我不知道从哪里开始。我最接近的是预制的arduino串行解析库。但是我正在寻找更多的C /非arduino /理论方法。

我已经研究了串行协议,但这仅仅是诸如SPI和I2C之类的东西,而不是实际上如何在软件中实现控制/命令接口的东西。

我还发现了有关HDLC的信息,尽管它似乎更多是一种标准/协议。一个类似的线程是 /programming/1445387/how-do-you-design-a-serial-command-protocol-for-an-embedded-system, 它具有一些非常好的信息,但同样可以做与协议/通信本身。

我试图找到如何编码/实现此功能以创建命令或控制能力。

我是否使用无限循环来监视和捕获传入命令的序列,并使用IF语句列表选择要执行的命令,但是当没有命令且系统应该正常运行时,或者如果它正常运行,会发生什么情况?错过命令?

中断驱动的状态机?

是否有官方名称可用于研究和查找示例?

编辑:

对于任何有相同问题的人,我在研究时都发现了一个非常不错的示例, http://www.adnbr.co.uk/articles/parsing-simple-usart-commands


为什么不使用FreeMODBUS或Firmata之类的框架?
伊格纳西奥·巴斯克斯

Answers:


5

有很多方法可以实现通信协议。例如,您可以选择使用:

  • 可读格式或二进制
  • 错误检查,例如校验和或CRC
  • 起始和/或结束消息字符
  • 消息长度,数量等有效载荷信息
  • 确认/否定确认/重试机制

您的示例命令是人类可读的,并且应使用'\ n'(输入)作为消息字符的结尾。消息字符的开始/结尾使解析输入流变得更加容易。

典型的程序流程是等待接收到开始字符,然后将后续字节存储到消息缓冲区中,直到接收到结束字符为止。一旦发生这种情况,将缓冲区传递给另一个函数以解析消息。如果没有开始字符,则立即开始存储字节,直到收到结束字符为止。

大多数*嵌入式系统在无限循环中运行。串行发送和接收的处理是通过Arduino上的中断完成的(请参阅HardwareSerial.cpp)。接收到的字符被放入缓冲区。在循环的每次迭代中,您都要检查缓冲区中是否有任何字符(Serial.available())并进行处理。通过使用中断接收字符,不会丢失任何字符。但是,您不会在这些中断例程中进行所有处理,否则它们会变得太长,因此会丢失后续的中断。

如果您不希望设备处于空闲循环状态,请将其置于睡眠状态以“暂停”循环,直到发生中断或其他事件为止。

我真的很喜欢这个用于人类可读消息的库:http : //playground.arduino.cc/Code/Messenger

*我想不出一个没有的系统,但也许那里有一个。


3

您的程序要做的全部是:
1.经常检查串行端口是否有新字符
2.跳到适当的例程/设置状态/视字符而定
3.转到1

该程序可以作用于单个字符,也可以创建自己的消息格式-我经常以“ $”开头cammand并以换行符结尾,并对命令使用可读的ASCII字符(使调试更容易!)。

确保该程序在收到无效命令后不会挂断!


一些自动测试设备(ATE)使用非常相似的串行链接来执行此操作。
汤匙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.