STM32F030k6串口通信,按照自定义的通信协议格式发送
本帖最后由 西奥伟 于 2018-11-13 13:52 编辑按照上图的通信协议格式发送和接收,期望每次是以一帧数据包的方式发送,使用的HAL库,大概思路是怎么发送,请教一下论坛的朋友们指点指点?
你发送数据是定时发,还是接收到什么数据后在发送,编写一个发送函数,按照你制定的协议,这个比较简单。接收部分用中断接收,进中断后,读取串口缓存区数据,如果是0x6D,置一个标志位,否则接收标志清零退出中断。第一个字节是0x6D后,接收数据位数。提供个大概流程,中间要判断接收数据超时。。。
switch (接收标志位)
{
case 0x00:
if(接收数据==0x6d)
{
接收标志位=1
}
break;
case 0x01:
接收字节数
接收标志位=2
break;
case 0x02:
接收数据
break;
default:
break;
}
学习了 你这不就是字节流嘛,串口怎么发字符串的,你就按类似的方式发送就行了。不过我没怎么使用HAL库,用标准库 我喜欢用一个定时器来测量帧间的间隔,不好的地方是数据帧要连续发送,帧间要有时隙区分前后帧;但是大部分情况通用,不用区分协议,用时间间隙来区分帧;通用.接受完直接交给处理函数;在接收中断内每次接收到数据后初始化定时器,定时中断内定时时间到置标志位,主循环根据标志位进行处理.处理完毕清除标志位.接收缓冲使用双缓冲而不使用环形缓冲;发送就随便了. 你只问发送部分的话,你自己写个函数用于发送你的数据(把裸数据加上协议最后调用HAL库的发送函数:HAL_UART_Transmit) 如
void frame_transmit(u8 *buf,u8 length,u8 cmd)
{
u8 temp={0},i,Xor=0;
u16 Sum=0;
temp=0x6D;
temp=length;
temp=0;
temp=0xB0;
temp=cmd;
for(i=5;i<length;i++)
{
temp=buf;
}
for(i=3;i<length;i++)
{
Xor^=temp;
}
Xor~=Xor;
temp=Xor;
for(i=3;i<length+1;i++)
{
sum+=temp;
}
temp=sum&0xff;
HAL_UART_Transmit(&UART1_Handler,(uint8_t*)temp,length+2,1000);
}
接收部分建议用一个10~20ms定时器用于判断一帧的结束,就不展开讲了:lol 先做一个打包函数,把协议打包起来,放入一个数据里,把长度算好了,最后调用 发送,这个比较方便,接收你可以用中断方式或发送完一包后进入等待方式 ,因为长度不能确定,你只能加一定的延时来保证数据正确接收完,
while((USART1->ISR&UART_FLAG_TXE)!=UART_FLAG_TXE);
USART1->TDR = *str;
用这种方式 ,这样就与库没有关系了 TLLED 发表于 2018-10-30 18:01
你发送数据是定时发,还是接收到什么数据后在发送,编写一个发送函数,按照你制定的协议,这个比较简单。接 ...
非常感谢,已经成功实现了 聪神聪 发表于 2018-11-1 09:52
你只问发送部分的话,你自己写个函数用于发送你的数据(把裸数据加上协议最后调用HAL库的发送函数:HAL_UAR ...
非常感谢,已经成功实现了 chifen 发表于 2018-11-1 19:44
先做一个打包函数,把协议打包起来,放入一个数据里,把长度算好了,最后调用 发送,这个比较方便,接收你可以用 ...
嗯嗯,明白了,你相当于是直接操作寄存器
页:
[1]