你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
西奥伟 提问时间:2018-10-30 16:36 /
悬赏1ST金币未解决
本帖最后由 西奥伟 于 2018-11-13 13:52 编辑

1.png

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

收藏 1 评论9 发布时间:2018-10-30 16:36

举报

9个回答
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;
}

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

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[20]={0},i,Xor=0;
    u16 Sum=0;
    temp[0]=0x6D;
    temp[1]=length;
    temp[2]=0;
    temp[3]=0xB0;
    temp[4]=cmd;
    for(i=5;i<length;i++)
    {
       temp[i]=buf[i-5];
    }
    for(i=3;i<length;i++)
    {
      Xor^=temp[i];
    }
    Xor~=Xor;
    temp[length]=Xor;
   for(i=3;i<length+1;i++)
   {
      sum+=temp[i];
   }
    temp[length+1]=sum&0xff;
    HAL_UART_Transmit(&UART1_Handler,(uint8_t*)temp,length+2,1000);

}
接收部分建议用一个10~20ms定时器用于判断一帧的结束,就不展开讲了
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
先做一个打包函数,把协议打包起来,放入一个数据里,把长度算好了,最后调用 发送,这个比较方便,接收你可以用 ...

嗯嗯,明白了,你相当于是直接操作寄存器
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版