我正在寻找一种轻量级的消息传递协议或结构,我可以使用它通过UART通过微控制器LED,LCD等来传输简单数据。我想我可以用“LED1 ON,LED1 OFF,LED1 GREEN等”命令发送字符串ASCII数据。
我正在使用以太网到RS232(UART)模块,我有一个应用程序处理UDP数据包并解析它们的特定数据。然后来自UDP的这些数据用于控制诸如打开LED,七段显示或LCD串消息之类的事物。
所有外围控制,如控制LED,七段显示和LCD,都由AVR微控制器处理。该架构几乎就像一个主设备(以太网控制器)和从设备(AVR)。但是我还需要能够从AVR获取消息,例如按下按钮和心跳消息。
我在想发送像
这样的东西struct HWCtrlData
{
unsigned char deviceID;
unsigned char deviceDataLen;
unsigned char deviceData[255];
}
因此,我可以为每个要控制的设备,数据长度和实际数据设置唯一的deviceID。
我以为我可以将ASCII字符串发送到RGB LED,七段显示器和LCD:
发送LED1“绿色”,它会将RGB LED变为绿色,例如。
有更好的方法吗?我是否必须担心ASCII字符串和数据损坏,错误检查(CRC?)
是否存在可以为我执行此操作的协议?
答案 0 :(得分:0)
首先你要注意的是控制数据包的开始和结束。只有两种方法(如果不使用硬件流控制)让我们采用Modbus协议。它有两个实现RTU和ASCII。如果在两个连续字节之间出现3,5个符号的延迟,则首先检测分组的结束。秒使用起始符号0x3A(:)来检测数据包的开头。 第一个协议较短但需要更快的MCU速度。
使用或不使用LRC,CRC校验取决于电线长度和电气环境。如果您有错误,那么您需要控制检查。 RTU Modbus使用CRC,而ascii使用lrc。
不要在协议中使用复杂的字符串,最简单的格式(对我来说):[操作码] [寄存器] [值] - 仅4字节。
答案 1 :(得分:0)
很多方法可以做到这一点,理想情况下,你确实需要某种校验和以及某种方式来区分边界。所以启动模式(某个字符)长度(可能是一个字节,二进制),有效负载,校验和。或启动模式,有效负载,校验和,停止模式(某些字符/字节)。
你可以看看NMEA如何做到这一切都是ascii。有一个实际上是一个单词的开始模式,如果你需要那个逗号分隔参数,那么一个停止模式然后在ascii中它有一个有效负载的校验和。所以你可以在ascii中看到所有这些,但它具有所有所需的功能。
对于你的你可能可以逃脱,一个开始模式和一个校验和,可能是几位数字。由于您的可能命令列表可能很短,因此它们是自我检查。不太可能,但你不希望错过和被视为一样。或者LED1 ON LED2关闭,但有些字符会丢失,并在LED1关闭时进入。所以校验和将覆盖那个。