调试测试工具的时候,STM32F1_串口2通用引脚通过MAX3232芯片发送数据包给另外一个厂家的设备时,设备没有任何的反应。通过串口监控精灵,查看数据识别不了
sscom串口助手上看时间戳是同等的时间(没有分开来是整条数据)
看上去没有任何的问题,MCU发送出去的没任何动作,电脑通过串口助手发送才会正常动作,于是乎,通过CommMonitor 串口监控精灵查看数据是不是发送正常不。结果得到以下信息
我所发送的数据为 01 06 00 1F 06 66 3B 86
上图中绿色的是电脑串口发送出来的,而蓝色的是MCU发送出来的。从上图看发送的数据是对的,但是设备就是没有任何反应。就开始怀疑是数据分裂开来,导致指令识别有问题。分离开来的数据时间差也有20ms,个人感觉太长了。
接下来在想为什么会导致分裂的呢?
01 06 00 后面就开始了,联想到UART是不是状态标志位恰好判断到了“空数据”才会断开的呢?
接着开始修改发送数据包将“00”改成“AA”监控结果,果然是没有断开
弄到这里就想着,串口程序里面是不是判读了标志位的问题。0x00认为是“空数据”才会断开?
由于串口是采用轮询的方式进行,开始琢磨着STM32串口写法的问题。
尝试了两种方式写法,作用依旧存在。
方法一:
方法二:
那么轮询的方式 依旧会断开来,那么使用DMA方式能不能解决呢?接下来就编辑了串口2的DMA传输。
这里直接借鉴https://blog.csdn.net/lnniyunlong99/article/details/90549732
测试后依旧会存在断开的情况,情况跟轮询方式一样断开来。
那么我尝试着发多个数据(数据包头加乱七八糟,包尾也加上加乱七八糟) 最终保持我这个想要发送的数据没问题就可以了,尝试了几次,断开的位置都是不一样,但是有完整一串我需要用的数据,依然没出息奇迹。或许就不是这个问题的原因。
之后又找到这位大佬说的
本来就没有什么“帧数据”的概念,只有流的概念。纠结那个你会永远也找不到永不分包的方法。你本来就应该连续接收数据,这种底层简单机制跟“帧”没有关系。如果说有帧,那是你高层次的信令协议来设计的,而你又没有这方面的概念。
突然之间茅塞顿开起来。我着手试试在电脑端的串口助手里面
所需要的数据上加前面与后面都加上00或FF
所需要的数据上加前面与后面都加上00或FF
我也试着将我所需要的数据分段来依次发送出去以上设备都有对应的动作运行。也知道了设备也使用了环形队列,证明对于分段开来也是没有问题的。
以上都排除了,我只能怀疑我的线有问题(太长或者中间有串口接头,不是(一对一的结构,我是从中间抽线出来)),现在不要了直接尝试。结果发送各个数据包都有对应的动作了。问题解决原来是线的问题。。。。。。。