首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >串行点对点协议,但有8个字节而不是16个字节

串行点对点协议,但有8个字节而不是16个字节
EN

Stack Overflow用户
提问于 2017-12-07 20:12:05
回答 1查看 165关注 0票数 0

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

速度是一个问题,

眼前的问题是速度。因为每个分组的通信至少需要在主站和从站之间每秒进行4倍。

让我们假设数据的波特率是9600 Let。每秒960字节。

如果我使用16字节的数据包,那么: 40 (从)乘16(字节)乘以2(途径)= 640。把它除以960,那就意味着每秒超过1/2。不太好。

如果我使用8字节数据包,那么: 40 (从)乘8(字节)乘以2(途径)= 320。把它除以960,那就意味着1/3秒。太-太好了。

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

分组格式idea

在我的设计中,我可能需要发送一个低百万的数字,这样就可以使用符合我想法的24位。但我的最初想法是:

代码语言:javascript
复制
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个字节。

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

EN

回答 1

Stack Overflow用户

发布于 2017-12-08 19:09:36

依赖于校验和!我的数据包将由以下内容组成:

  1. 收件人地址(0..40) XORed ( 0x55 )
  2. 发送者地址(0..40)带有0xAA的XORed
  3. 命令Byte
  4. 数据字节0
  5. 数据字节1
  6. 数据字节2
  7. CRC8求和,如Vroomfondel所建议

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

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

特别是最后一个应该安全地拒绝接收者跳到离同步的数据包。

如果你有少于32个命令码,你可以降低到每包6个字节:40发送者乘以40接收者乘以32命令计算为51200,这将容纳16位而不是24位。

别忘了关闭奇偶校验位!

更新2017-12-09:这里有接收功能:

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47703016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档