帮忙设计一下串口通信程序

karl320525   2010-2-5 13:23 楼主
两个单片机相互通讯,数据包 = 3字节指令 + 1~4字节的数据。
一次大概有50个数据包。
一个单片机发送数据包,另外一个接收。
两个单片机都在一块板子内。

请问:这两个串口的程序该怎么设计,才能保证数据不会出错。(对数据的正确性要求很高)。请详细说下程序的架构,谢谢了。
在线等。

回复评论 (26)

- -。
数据不一定是4B,
1B的校验码做什么用?校验和?不够吧?还是奇偶校验?
另外为什么要正好是8B。8B有什么玄机在里面?
点赞  2010-2-5 14:03
推荐一个简介的实用的通信协议吧,thanks
点赞  2010-2-5 14:05
MODBUS
点赞  2010-2-5 15:53
引用: 引用 5 楼 kyzf 的回复:
针对楼主这种情况,我给你定义一种吧(类似于NXP的串口通讯协议格式)
1、1字节的前导码(可以为00,也可以为AA,自己定义)
2、3字节的指令
3、1字节指令的CCS(CCS+CM0+CM1+CM2=0x00)
4、1字节的数据长短LEN(用来标识数据是多少字节)
5、1字节LCS(LEN+LCS=0x00)
6、1-4字节的DATA(具体长度,看你具体发送多少字节的数据)
7、1字节的DCS(DCS+D0+D1+D2+D3=0x00)
8、1字节的后导码(结束码)
用这么多CS干什么?不费事么?
我估计数据长度都不需要,根据指令字该能确定有多少字节的数据. 所以"3B指令+4B数据+1B检验"足够了
点赞  2010-2-5 15:54
对了,还要加入一个当前数据包的号码。
接收方每次收包先检验校验码,如果不对就丢掉,如果正确再解包。
最后,传输结束,发现有包连续号码中丢失的,要求发送端将丢失包重新发送。
点赞  2010-2-5 16:21

7楼 hkt 

引用: 引用楼主 kongfo1019 的回复:
两个单片机相互通讯,数据包 = 3字节指令 + 1~4字节的数据。
一次大概有50个数据包。
一个单片机发送数据包,另外一个接收。
两个单片机都在一块板子内。

请问:这两个串口的程序该怎么设计,才能保证数据不会出错。(对数据的正确性要求很高)。请详细说下程序的架构,谢谢了。
在线等。
LZ的板子多半是个试验板,估计可以不考虑干扰造成的数据丢失,而且对可靠性要求并不严肃
点赞  2010-2-5 16:55
楼主自己定个协议
点赞  2010-2-5 19:32
引用: 引用楼主 kongfo1019 的回复:
两个单片机相互通讯,数据包 = 3字节指令 + 1~4字节的数据。
一次大概有50个数据包。
一个单片机发送数据包,另外一个接收。
两个单片机都在一块板子内。

请问:这两个串口的程序该怎么设计,才能保证数据不会出错。(对数据的正确性要求很高)。请详细说下程序的架构,谢谢了。
在线等。

如果都在一个板子上,用spi多好呀!为什么要用串口?
点赞  2010-2-6 09:01
我做法,用前导码 + 内容 + 校难码 + 后导码
而内容是2个Byte合成1个Byte的,纠错能力很强.
我的做法,是宁愿牺牲一点传输效率,也要保证传输安全.
点赞  2010-2-6 09:45
3B指令+4B数据+1B校验码,正好8B
点赞  2010-2-5 13:55
楼主有NXP的RC或PN系列的IC的软件手册吗?
他们那种通讯协议方案 很很不错。
点赞  2010-2-5 14:44
针对楼主这种情况,我给你定义一种吧(类似于NXP的串口通讯协议格式)
1、1字节的前导码(可以为00,也可以为AA,自己定义)
2、3字节的指令
3、1字节指令的CCS(CCS+CM0+CM1+CM2=0x00)
4、1字节的数据长短LEN(用来标识数据是多少字节)
5、1字节LCS(LEN+LCS=0x00)
6、1-4字节的DATA(具体长度,看你具体发送多少字节的数据)
7、1字节的DCS(DCS+D0+D1+D2+D3=0x00)
8、1字节的后导码(结束码)
点赞  2010-2-5 15:08
引用: 引用 5 楼 kyzf 的回复:
针对楼主这种情况,我给你定义一种吧(类似于NXP的串口通讯协议格式)
1、1字节的前导码(可以为00,也可以为AA,自己定义)
2、3字节的指令
3、1字节指令的CCS(CCS+CM0+CM1+CM2=0x00)
4、1字节的数据长短LEN(用来标识数据是多少字节)
5、1字节LCS(LEN+LCS=0x00)
6、1-4字节的DATA(具体长度,看你具体发送多少字节的数据)
7、1字节的DCS(DCS+D0+D1+D2+D3=0x00)
8、1字节的后导码(结束码)


顶这个。。。
点赞  2010-2-5 15:15
"前导码"有什么用?我觉得除了增加代码没有其它价值了
点赞  2010-2-5 15:56
引用: 引用 8 楼 great_bug 的回复:
引用 5 楼 kyzf 的回复:
针对楼主这种情况,我给你定义一种吧(类似于NXP的串口通讯协议格式)
1、1字节的前导码(可以为00,也可以为AA,自己定义)
2、3字节的指令
3、1字节指令的CCS(CCS+CM0+CM1+CM2=0x00)
4、1字节的数据长短LEN(用来标识数据是多少字节)
5、1字节LCS(LEN+LCS=0x00)
6、1-4字节的DATA(具体长度,看你具体发送多少字节的数据)
7、1字节的DCS(DCS+D0+D1+D2+D3=0x00)
8、1字节的后导码(结束码)
用这么多CS干什么?不费事么?
我估计数据长度都不需要,根据指令字该能确定有多少字节的数据. 所以"3B指令+4B数据+1B检验"足够了


估计楼上都没用过要求比较安全和可靠性高的IC,
建议你去了解下PSAM 和高频的RFID,以及移动支付行业、银联POS的串行通讯 对应的串口的协议格式。

虽然知道3字节的指令,到时如果指令传输出错,你怎么知道,所以必修需要CCS
数据长度可变,你没有LEN,你当初传输的数据如果丢掉一个字节(比如0x00),你怎么知道?

没有前导码,你怎么什么时候传输数据,估计遇到EMC干扰,按照你们的格式,也会把EMC干扰对应信号,当成数据。

以上仅个人经验 和建议。楼主可以好好了解和参考,谢谢!
点赞  2010-2-5 16:15
引用: 引用 5 楼 kyzf 的回复:
针对楼主这种情况,我给你定义一种吧(类似于NXP的串口通讯协议格式)
1、1字节的前导码(可以为00,也可以为AA,自己定义)
2、3字节的指令
3、1字节指令的CCS(CCS+CM0+CM1+CM2=0x00)
4、1字节的数据长短LEN(用来标识数据是多少字节)
5、1字节LCS(LEN+LCS=0x00)
6、1-4字节的DATA(具体长度,看你具体发送多少字节的数据)
7、1字节的DCS(DCS+D0+D1+D2+D3=0x00)
8、1字节的后导码(结束码)


后面再加入一个校验码就完美了。
9. 1字节的校验码(前面所有字节的异或后的值)
点赞  2010-2-5 16:17
引用: 引用楼主 kongfo1019 的回复:
两个单片机相互通讯,数据包 = 3字节指令 + 1~4字节的数据。
一次大概有50个数据包。
一个单片机发送数据包,另外一个接收。
两个单片机都在一块板子内。

请问:这两个串口的程序该怎么设计,才能保证数据不会出错。(对数据的正确性要求很高)。请详细说下程序的架构,谢谢了。
在线等。

1、为什么需要“3字节指令”,需要这么多种指令吗?三个字节可是16777216种组合。我感觉用一个字节足矣。
2、既然是“1~4字节的数据”,那么完全可以每次都发送4个字节,无非不都使用而已,这样就可以发送固定长度的数据,便于处理。
3、“保证数据不会出错”这一点太过于理想。必须得考虑如果出错了怎么处理。加上校验码也只是识别一下是否出错了。以便出错后进行后续操作。
点赞  2010-2-5 16:17
#4的见解正确,这个协议是我用过的抗干扰不错的一个
另外,楼主不用SPI肯定有一些考虑,比如还有优先级更高的信号要处理吧。
点赞  2010-2-7 22:13
引用: 引用 5 楼 kyzf 的回复:
针对楼主这种情况,我给你定义一种吧(类似于NXP的串口通讯协议格式)
1、1字节的前导码(可以为00,也可以为AA,自己定义)
2、3字节的指令
3、1字节指令的CCS(CCS+CM0+CM1+CM2=0x00)
4、1字节的数据长短LEN(用来标识数据是多少字节)
5、1字节LCS(LEN+LCS=0x00)
6、1-4字节的DATA(具体长度,看你具体发送多少字节的数据)
7、1字节的DCS(DCS+D0+D1+D2+D3=0x00)
8、1字节的后导码(结束码)

CCS,LCS,DCS是什么?
点赞  2010-2-5 18:17
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复