【问题标题】:Serial point to point protocol but with 8 bytes instead of 16串行点对点协议,但使用 8 个字节而不是 16 个字节
【发布时间】:2018-05-22 00:43:09
【问题描述】:

我在Simple serial point-to-point communication protocol 中查看答案,但它对我的问题没有足够的帮助。一开始我还尝试在计算机和 8 位微控制器之间进行数据通信,然后最终我想通过无线电模块将一个微控制器与大约 40 个其他微控制器进行通信。基本上一个被指定为master,其余的都是slave。

速度是个问题

手头的问题是速度。因为每个数据包的通信需要在主设备和每个从设备之间至少每秒 4 次来回进行。

假设数据的波特率为 9600bps。那是每秒 960 字节。

如果我使用 16 字节的数据包,那么:40(从属)乘以 16(字节)乘以 2(路)= 640。将其除以 960,这意味着超过 1/2 秒。不好。

如果我使用 8 字节数据包,则:40(从属)乘以 8(字节)乘以 2(路)= 320。将其除以 960,这意味着 1/3 秒。就是这样。

但问题是我需要注意我的波特率,因为太高的波特率可能意味着在更远的距离丢失数据,但您可以看到 8 字节和 16 字节数据包之间的速度差异。

数据包格式思路

在我的设计中,我可能需要传输数以百万计的数字,以便使用符合我想法的 24 位。但这是我最初的想法:

Byte 1: Recipient address 0-255
Byte 2: Sender address 0-255
Byte 3: Command
Byte 4-6: Data
Byte 7-8: 16-bit fletcher checksum of above data

我不介意上面的格式是否调整,只要我至少有6位来识别发送者和接收者(因为我只会处理40个单元),并且包含命令的数据应该总共至少 4 个字节。

我应该如何修改我的数据包想法,以便即使在接收过程中刚刚打开的设备也可以与下一组数据同步?有没有办法不从每个数据字节中剥离一点?

【问题讨论】:

  • 无线链路的带宽是否大致相同?因为如果是,那么我认为您必须进一步降低您的数据速率预期。 RF 通信启动和切换可能会遭受比有线通信更长的延迟。关于协议:如果它是真正的主从,您可以取消其中一个地址字节,因为它始终是涉及的主控。此外,也许 CRC8 可以替代 Fletcher 校验和。与现场总线速度相比,CPU 内带宽成本较低。
  • 是的,我将所有波特率设置为相同 (57.6K)。我也将本底噪声和偏差设置为最大设置。我使用的模块是 HM-TRP。我也在使用 8 位处理器 (AT89C4051) 进行测试。

标签: serial-port synchronization protocols microcontroller


【解决方案1】:

依靠校验和!我的数据包将包括:

  1. 收件人地址 (0..40) 与 0x55 异或
  2. 发件人地址 (0..40) 与 0xAA 异或
  3. 命令字节
  4. 数据字节 0
  5. 数据字节 1
  6. 数据字节 2
  7. CRC8 总和,由 Vroomfondel 建议

每个接收器都应该有一个包含最后七个接收字节的滑动窗口。当一个字节被移入时,该窗口应该检查它是否有效:

  • 这两个地址是否在有效范围内?
  • 这是一个有效的命令吗?
  • CRC 是否正确?

尤其是最后一个应该安全地拒绝接收器在不同步时跳到的数据包。

如果您的命令代码少于 32 个,则每个数据包可能会减少到 6 个字节:40[Senders] 乘以 40[Receivers] 乘以 32[Commands] 的计算结果为 51200,这将适合 16 位而不是 24 位。

别忘了关闭奇偶校验位!

2017-12-09 更新:这里有一个接收函数:

typedef uint8_t U8;

void ByteReceived(U8 Byte)
{
   static U8 Buf[7]; //Bytes received so far
   static U8 BufBC=0;

   Buf[BufBC++] = Byte;

   if (BufBC<7) return; //Msg incomplete

   /*** Seven Byte Message received ***/

   //Check Addresses
   U8 Adr;
   Adr = Buf[0] ^ 0x55; if (Adr >= 40) goto Fail;
   Adr = Buf[1] ^ 0xAA; if (Adr >= 40) goto Fail;

   if (Buf[2] > ???) goto Fail; //Check Cmd

   if (CalcCRC8(Buf, 6) != Buf[6]) goto Fail;

   Evaluate(...);

   BufBC=0; //empty Buf[]
   return;
Fail:
   //Seven Byte Msg invalid -> chop off first byte, could use memmove()
   Buf[0] = Buf[1];
   Buf[1] = Buf[2];
   Buf[2] = Buf[3];
   Buf[3] = Buf[4];
   Buf[4] = Buf[5];
   Buf[5] = Buf[6];
   BufBC  = 6;
}

【讨论】:

  • 当我监控分块数据时,它似乎在滑动。现在我想我得查找 8051 的滑动窗口
  • 也许我没有正确搜索,但查看滑动窗口协议意味着如果接收者发送确认,窗口会移动。但我需要针对半双工情况进行优化,因为我使用的无线电模块也仅限于半双工,其中在微机上进行的传输优先于数据接收(根据无线电模块)。
猜你喜欢
  • 2018-12-16
  • 2021-02-05
  • 2011-06-13
  • 2021-06-17
  • 2015-09-29
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
相关资源
最近更新 更多