2021-08-20

博主分享了在使用C51单片机制作测试设备时遇到的串口通讯问题。最初计划使用气缸推动锁舌,但因行程和动力源不合适而放弃。最终采用单片机控制步进电机和ADC0809实现压力测试。在串口通讯中,遇到数据溢出和程序停滞问题,通过分析发现是中断服务函数的冲突导致。解决方案是关闭串口中断进行数据发送,或者在中断服务中避免阻塞。博客强调了理解他人代码和简化编程思想的重要性。
摘要由CSDN通过智能技术生成

前段时间用C51单片机做测试设备的时候遇到一个坑,关于串口通讯的,拿来和猿们分享一下,哪里有不对的还请指教。

项目概述

客户要做一款测试锁体的治具设备,当被测锁体双向舌受到一个100N的力时,会触发一个解锁信号;检测到信号后便收回主锁舌,主锁舌的伸出和收回都有相应的信号被触发。还有其他一些杂七杂八的信号就不拿出来废话了,反正要求能设定压力值,能判断测试通过与否,能显示数据,关键是还要连接客户公司的MES。听到这我心态都要崩了呀,这通讯协议不好对接。后面协商说留个通讯接口就OK了。

测试方案

方案一:原先想用气缸来推动锁舌,以此来触发锁体信号。但是想想觉得气缸这玩意不合适,1、其行程位置不合适,位置就原点和尽点。当气缸行至尽点时,气压允许的情况下则是其所能输出的最大压力;想要达到压力值可调,那么就要求气缸的行程能够动态的也发生改变,但是看着这玩意想想还是算了。2、其动力源不合适,气缸伸缩速度的快与慢会影响到整个测试;快了会产生很大的震动及噪音,甚至会打坏测试产品。慢了则会影响测试效率,当设定压力较大时,还有可能输出压力不足;因为气缸的低速是以降低气压量换取的。气压低了,输出力自然也低。据此否定此方案

方案二:用单片机控制步进电机的行程,以此来向锁舌输出100N的力,同时用传感器采集压力变化量(网上有很多压力传感器,都是已经采集转换好的数字数据,直接用485通讯就能获取,成本较高。但是因为我懒,不想去编那个通讯程序。后来直接买了个八位的数模转换芯片ADC0809自己焊,这省钱的本事也真没谁了。哈哈哈!),再用ADC0809将模拟量转变成数字量传送给单片机处理,经单片机处理后的数据再传输到液晶屏进行显示。完美!

关于串口通讯的坑!

由于保密原因这里就不把产品图片和设备的照片发出来了。废话不多说,来!上菜。
下面是部分程序截图。
1、这是通讯格式:
在这里插入图片描述
2、串口中断服务函数
在这里插入图片描述
PC收到指令后,先返回指令码。再返回查询信息。这时有个小问题,串口一次只能发送八位数据(即255),但是我要把产品测试OK和测试NG的数量发送给PC,如果数量超过255,那么只会发送数据的低八位,高位被舍弃。例如测试OK数量为300(0X12C),当把300发送给PC时,PC只收到2C,而不是12C。遇到问题,鞭它!这时就需要用到开始定义的几个变量了,程序判断数据超过255,就先将数据转化一次,求出十六进制的每一位,在以两位两位(十六进制的一位是二进制的四位)的形式通过串口发送给PC。(这是晚上做梦的时候想出来的,哈哈!)

3、在测试过程中向PC反馈测试信息(坑在此!)
在这里插入图片描述
这串口发送程序有问题,当发送完数据后程序就停止不前了,导致后面测试无法进行。刚开始以为是while(!TI);等待数据发送结束的问题,改用delay(100);以延时来判定数据发送完毕,上机后还是不行。又以为是串口初始化的问题,改了几种串口的工作方式,也还是不行。反复加bug调试程序,也找不出问题。气死哥了!没办法,只能祭出大脑了,用脑子跑一便程序。跟着程序走了走,发现程序原来卡在串口中断函数那里了。
在这里插入图片描述
这个问题的关键点是,只要开启串口中断允许位ES,无论是发送还是接收引起的中断,程序都会执行一次中断服务函数。而我恰好在中断函数开始处等待接收数据(上图标记处),这就矛盾了,程序跑进坑里去了。解决办法,1、不走这条路,在发送数据前关掉串口中断ES,发送完在开启ES。2、程序走到这时自己把坑填平,把while(!RI);换成delay(100);用延时来判定接收结束。nice!
在这里插入图片描述

总结

关于编程的一些个人看法。想编程呢,首先要会看别人的程序。如果拿到一份程序,你看了就能知道别人想干嘛,编的是什么程序,达到什么目的。那你就是大拇指!如果你拿到一份程序,你连别人想干嘛都不知道,想要用程序达到什么目的都不清楚。显然你编的程序也没多少看点。CSDN不错,有很多大佬,每次看完他们的程序我都刷新一次对编程的看法,诸如格式的规范,程序算法、以及程序优化。其实编程不是写得满屏代码就是好;也不是用一大堆指针来把数据当皮球踢来踢去的,搞得人人都看不懂写的什么鬼东西就很厉害。编程应该是把复杂的问题简单化,把自己的控制想法用代码告诉机器该做什么,该怎么做!由于时间问题就不多废话了…以上纯属个人观点,那里有不对的还请忽略!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值