就是目前遇到一个项目,是监视各个按钮状态并将各个按钮的状态发送至上位机,上位机进行整体程序逻辑动作。一般情况下串口发送可以直接一直发送给上位机,通过解析不同数据位0和1的状态可以知道具体哪个按钮按下,而且现在实际为减少上位机整体解析工作量,要求的发送机制是哪个按钮按下才会触发发送机制,不会一直通过串口给上位机,这样既减少上位机处理数据的压力,也可以单独定位具体的按钮位置容易排查问题点!具体的实现过程如下:
首先,用STM32CubeMX配置各个芯片引脚定义(具体配置过程,我就不在过多的赘述了,小伙伴可以百度查阅),配置的结果如下:
通过引脚配置图,可以看出IO口其实还是挺多的,有23个DI,当然这个是我用到的,实际小伙伴们可以进行删减增添!
下面咱们说说实现原理,具体过程就是咱们可以通过实际DI的状态刷新进行自比较后再串口发送(自比较就是比较上一次状态和本次的状态是否有变化,有变化就发送,没有变化就不发送),具体程序如下图:
1、读取DI状态,这个在main函数中先读一次初始状态进行存储,就是一个最原始的初值,先从外设得到,也就是最开始比较的本体。
2、进行状态变化判定,这一步其实就是自比较程序,比较本次读取的状态与上一次读取的状态值,具体程序如下图:
程序简单解析:状态判定就是再读一次实际状态,跟上次ReadID中状态进行比较,变化了就重新赋值,依次进行状态交替就能实现,并通过串口进行发送!发送数据为前期双方定义好的,第一个字节5b为数据头,第二个字节为按钮标号从01到23的十六进制表示方式,第三个字节为状态位,01按下,00断开,最后一位为前面的和校验,当然这个定义的数据结构可以自行确定含义,只要与上位机达成一致双方都知道就好!
3、在时间中断函数中调用查询,我是放在中断函数中定时进行判断,其实就是刷新数据,我这个是10ms,其实根据自己按钮的紧急程度进行设置中断函数,比如,这个DI里面有关于急停的信号,可以设置为1ms读取一次状态,按照信号的轻重缓急进行区分对待放在不同的中断函数中进行发送。
这样就能够实现按钮变化发送数据,当然这个只是我用STM32F103实现的,用的HAL库函数,咱们STM32芯片很容易程序移植,这个框架也可以用到其他STM芯片,其实更多的还是编程逻辑,希望大家多多提供好的STM32编程思想,大家多多交流!
---------------------
作者:jf101
链接:https://bbs.21ic.com/icview-3251304-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。