gpt4 book ai didi

c - 用C语言设计一个简单而健壮的主机(PC或ARM板)和从机(微处理器)之间的串行协议(protocol)

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:29 25 4
gpt4 key购买 nike

我想在两个设备之间创建一个简单而强大的通信协议(protocol):主设备和从设备。主机可以是 pc 或 arm iMX6 bard 或具有 QT 或 Visual Studio 应用程序的等效板,而从机可以是微处理器,如 AVR 或 Microchip。我想找到最好的解决方案来设计它们之间的简单而强大的串行协议(protocol)。我考虑过两种可能的解决方案,但也许还有其他解决方案。

第一种方案——同步通信

MASTER 发送 COMMAND_START(一个字节)

SLAVE 以 START_ACKNOLEDGE(一个字节)回答

MASTER 发送命令 COMMAND(更多字节,末尾有一个校验和字节)

SLAVE 用 COMMAND_ACKNOLEDGE(一个字节)回答,如果有必要用一些字节的信息包(一些字节末尾有一个校验和字节)

MASTER 回复 PACKETS_ACKNOLEDGE(一个字节)

MASTER 发送 COMMAND_END(一个字节)

从站必须在 1 毫秒或 2 毫秒内回复主站。使用此解决方案,主站可以轻松检查通信,如果从站没有应答,或者如果从站在 1 或 2 毫秒内没有应答,或者如果从站发送的数据包的校验和不正确,则主站可以发送另一次命令。这样master就很容易处理这种情况。从另一方面看,这个协议(protocol)是一个同步通信协议(protocol)。

第二种方案:

Master向slave发送命令,结构如下:

起始字节:0xAA (10101010)

命令字节:一个字节(不同于0xAA、0xCC、0x33、0xC3或0x3C)

数据长度:一个字节,有数据字节数的信息(有必要吗?)

数据字节:一个或多个字节

校验和:一个字节

结束字节:0xCC 0x33 0xC3 0x3C (11001100001100111100001100111100)

在这种情况下,slave 可以使用带有两个指针的循环缓冲区,它可以做这样的事情:

if(RxStart!=RxStop)
{
while((RxStop>=RxStart)&&(RxStop-RxStart>=X+4))
{
if(RxBuff[RxStart & 0xFF]==0xAA && RxBuff[(RxStart+X) & 0xFF]==0xCC &&
RxBuff[(RxStart+X+1) & 0xFF]==0x33 && RxBuff[(RxStart+X+2) & 0xFF]==0xC3
&& RxBuff[(RxStart+X+3) & 0xFF]==0x3C)
{
if(CheckSum==OK)
{
switch(RxBuff[RxStart+1 & 0xFF])
{

}
}
}
}
}

在这种情况下,主机如何检查发送给从机的命令是否已经收到?从站是否必须向主站发送确认命令,例如一个字节用于确认,一个字节包含有关命令的信息? master 是否必须检查 slave 是否在 1ms 内响应命令? master 是否必须检查从 slave 收到的 acknoledge 的数量?如果从从机收到的确认少于主机发送的命令,那么主机怎么知道哪个命令丢失了?让我知道!

非常感谢您的支持!

最佳答案

我会把它作为评论,但我还没有声望:)

您回避这些标准有什么原因吗? i2C、SPI、UART?

如果您需要基于软件的协议(protocol),可以引用一些很好的示例来模拟您的协议(protocol):

https://github.com/plieningerweb/esp8266-software-uart https://github.com/wendlers/msp430-softuart

如果您确实想选择一个标准,这里有一个很好的比较页面来找出您需要的那个: http://www.embedded.com/design/connectivity/4023975/Serial-Protocols-Compared

关于c - 用C语言设计一个简单而健壮的主机(PC或ARM板)和从机(微处理器)之间的串行协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30414920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com