我在看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位。但我的最初想法是:
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个字节。
我应该如何修改我的数据包想法,以便即使是在接收过程中打开的设备也可以与下一组数据同步?有没有一种不从每个数据字节中去掉一点的方法?
发布于 2017-12-08 19:09:36
依赖于校验和!我的数据包将由以下内容组成:
每个接收方都应该有一个滑动窗口,该窗口是接收到的最后七个字节。当一个字节被移入时,该窗口应该检查它是否有效:
特别是最后一个应该安全地拒绝接收者跳到离同步的数据包。
如果你有少于32个命令码,你可以降低到每包6个字节:40发送者乘以40接收者乘以32命令计算为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;
}https://stackoverflow.com/questions/47703016
复制相似问题