西奥伟 发表于 2018-10-30 16:36:48

STM32F030k6串口通信,按照自定义的通信协议格式发送

本帖最后由 西奥伟 于 2018-11-13 13:52 编辑



按照上图的通信协议格式发送和接收,期望每次是以一帧数据包的方式发送,使用的HAL库,大概思路是怎么发送,请教一下论坛的朋友们指点指点?

TLLED 发表于 2018-10-30 18:01:36

你发送数据是定时发,还是接收到什么数据后在发送,编写一个发送函数,按照你制定的协议,这个比较简单。接收部分用中断接收,进中断后,读取串口缓存区数据,如果是0x6D,置一个标志位,否则接收标志清零退出中断。第一个字节是0x6D后,接收数据位数。提供个大概流程,中间要判断接收数据超时。。。
switch (接收标志位)
{
        case 0x00:
               if(接收数据==0x6d)
               {
                接收标志位=1
               }
                break;
        case 0x01:
                接收字节数
                接收标志位=2
                break;
      case 0x02:
                接收数据
                break;
        default:
                break;
}

sincomaster 发表于 2018-10-31 08:44:15

学习了

stm1024 发表于 2018-11-1 09:47:59

你这不就是字节流嘛,串口怎么发字符串的,你就按类似的方式发送就行了。不过我没怎么使用HAL库,用标准库

askhua520 发表于 2018-11-1 09:51:11

我喜欢用一个定时器来测量帧间的间隔,不好的地方是数据帧要连续发送,帧间要有时隙区分前后帧;但是大部分情况通用,不用区分协议,用时间间隙来区分帧;通用.接受完直接交给处理函数;在接收中断内每次接收到数据后初始化定时器,定时中断内定时时间到置标志位,主循环根据标志位进行处理.处理完毕清除标志位.接收缓冲使用双缓冲而不使用环形缓冲;发送就随便了.

聪神聪 发表于 2018-11-1 09:52:42

你只问发送部分的话,你自己写个函数用于发送你的数据(把裸数据加上协议最后调用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

chifen 发表于 2018-11-1 19:44:47

先做一个打包函数,把协议打包起来,放入一个数据里,把长度算好了,最后调用 发送,这个比较方便,接收你可以用中断方式或发送完一包后进入等待方式 ,因为长度不能确定,你只能加一定的延时来保证数据正确接收完,

while((USART1->ISR&UART_FLAG_TXE)!=UART_FLAG_TXE);
USART1->TDR = *str;
用这种方式 ,这样就与库没有关系了

西奥伟 发表于 2018-11-13 13:49:32

TLLED 发表于 2018-10-30 18:01
你发送数据是定时发,还是接收到什么数据后在发送,编写一个发送函数,按照你制定的协议,这个比较简单。接 ...

非常感谢,已经成功实现了

西奥伟 发表于 2018-11-13 13:50:17

聪神聪 发表于 2018-11-1 09:52
你只问发送部分的话,你自己写个函数用于发送你的数据(把裸数据加上协议最后调用HAL库的发送函数:HAL_UAR ...

非常感谢,已经成功实现了

西奥伟 发表于 2018-11-13 13:51:13

chifen 发表于 2018-11-1 19:44
先做一个打包函数,把协议打包起来,放入一个数据里,把长度算好了,最后调用 发送,这个比较方便,接收你可以用 ...

嗯嗯,明白了,你相当于是直接操作寄存器
页: [1]
查看完整版本: STM32F030k6串口通信,按照自定义的通信协议格式发送