写一个串口接收发送程序

本文探讨了串口编程中常见的挑战,特别是如何有效地发送带有协议的数据。介绍了两种实用的方法:定界符法和显式长度法,并详细解释了显式长度法的实现过程,包括发送数据长度及接收方如何处理这些数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于串口,流,的编程一直是相当头疼的,总是分不清头尾,写出来的程序总是没有把握,传输间的的程序尚可,但是发送一些带协议的东西就受不了了。

经过查资料,学习,得到一些经验,可以使用定界符法,显式长度法来发送数据。

一贯习惯是使用定界符+显式长度,写的不论不类,现在想想没有这个必要,如果在单片机上的话使用定界符,在中断里快速判断定界符和过滤每一个字符是相当奢侈的事情。故而转用显式长度法

显式长度的具体用法是,先发送要发送数据的字节数,在发送数据

接收也比较简单,先接收数据长度区,判断大小是否适合自己的RAM空间,

确定需要接收的长度后,启动正常的接收,并设置一个超时(在有限的时间里没有收到完整的数据,则丢弃)。在实际的应用中,发送数据总是有个时间限制的,一组数据会在相对集中的时间内完成。


例子:发送abcdefg,

char[] data = "abcdefg";

char length = 0;//一个字节

char i = 0;

do{

length ++;

while(data[length] != '\0');

putc(length);

for(int i=0; i<length; i++)

{

putc(data[i]);

}

备注:该例子未经过验证,仅供参考





协议说明: CCU向各个终端所发的数据格式有3种:查询,令牌,广播 查询:CCU向各个终端一对一发送一串数据,CCU在发送完后,终端在一定时间内拥有发言权。 令牌:CCU发出令牌命令后,各个终端收到自己的令牌帧后,拥有总线的发言权, 必须在一定时间内发出帧头,否则,CCU取消该终端的发言权。发言完或者没有发言, 把令牌在规定的时间内传给下一个终端 广播:CCU发出广播帧后,各个终端必须按照广播帧工作,不要回复CCU,也没有总线发言权 格式: 查询:7E, 命令,目标网络,地址,数据长度,数据,校验,7E 令牌:7E,命令,当前虚拟地址,令牌,校验,7E 广播; 7E, FF, FF, FF,数据长度,数据,校验,7E 数据格式说明: 1,7E为帧头,帧尾标志。如果在数据里面遇到有7E,将数据7E拆分为7F,80,如 果数据里面有7F,将7F拆分为7F,81.在接收时,将上面数据合成相应的数。 2,目标网络:为各个终端所在的网络。T/R0 为00,T/R 为01,T/R2 为02,T/R3 为03,T/R4为04,FF为全局广播。 3,地址:为各个受控设备物理地址。如果全局广播就为FF。 4,命令:00为CCU查询各个终端。01为各个终端回复CCU查询。02为令牌命令。 全局广播为FF。 5,数据长度,数据的长度。 6,数据,即要发送的数据。 7, 校验:两个7E之间除了校验的所有数据相加,0X55减去这个数得到的是校验值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值