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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版