通过UART控制微控制器的消息传递协议

时间:2016-04-29 15:55:51

标签: protocols microcontroller

我正在寻找一种轻量级的消息传递协议或结构,我可以使用它通过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?)

是否存在可以为我执行此操作的协议?

2 个答案:

答案 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关闭时进入。所以校验和将覆盖那个。