基于STM32的通讯协议转换模块开发

背景介绍

机器人项目的需求,机器人与传感器1物理层采用RS485通讯,软件层有一套自定义协议1,波特率230400,偶校验,数据位8,停止位1,通讯速率固定250Hz。
现在换了一款传感器2,物理层也是485通讯,软件层是另外一套自由协议2,波特率115200,无校验,数据位8,停止位1,通讯速率最大1280Hz,可配置为4ms上传一次数据,即250Hz。项目要求传感器2继续使用传感器1的物理接口,软件也要完全兼容

方案

自然而然想到用STM32做协议转换,价格低、性能好。51单片机只适合做入门教学,项目应用还是太费劲,性能与STM32相比也相差太远。
首先要采购以下的元件:

  1. STM32C6T6最小系统板,价格只有8块钱左右。
  2. RS485转TTL模块2个,最便宜的4块钱左右,但是很容易坏,建议买贵的,我用的23块钱一个的。
  3. 降压模块,将机器人24V供电转换为3.3V供电,价格5块钱左右。
  4. 2.54间距螺钉式接线端子。
    用AD设计个元件焊接座子,或者用洞洞板把元件焊起来。当然,有能力的就不需要采购这些元件了,直接设计PCB就可以。我的方案硬件总成本少于70块,但是硬件体积比专门设计的PCB要大很多。日后我会试试改为PCB,看看成本如何。
    传感器2接485模块,接到单片机串口2(A2A3),传感器1接485模块,接到单片机串口1(A9A10)。

问题

软件部分遇到了好多坑:

  1. 串口2没有数据。原因是例程源码的串口2初始化代码是直接复制串口1的,只把uart1改为了usrt2,没有把PAB2改为PAB1总线
  2. 协议转换时,传感器2数据为int16,传感器1数据为自定义格式,12位,最高位为符号位,其余位为uint11数据。因此,协议转换时需要判断传感器2数据的符号:正数可以直接将低12位复制到传感器1数据内存中;负数需要把传感器1数据的符号位写为1,传感器2数据添负号转为正数,把低11位写入传感器1数据内存中。总之这套逻辑很繁琐,很容易出错。
  3. 串口1数据错乱。原因是STM32把校验位算作数据位,所以串口1初始化的数据位要填9。

总结

最后实测,协议转换模块完美实现了功能,计算速度很快,4ms以内就能完成协议转换,传感器2的性能与传感器1没有任何差别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值