搜索
bottom↓
回复: 14

STM32串口发送数组会有20ms左右时间间隔,正常吗?[7楼初...

[复制链接]

出0入4汤圆

发表于 2018-9-20 10:16:18 | 显示全部楼层 |阅读模式
本帖最后由 bolizhicheng204 于 2018-9-20 11:38 编辑

利用原子的XCOM进行IAP实验的时候发现,单片机发送的数据没问题,但是XCOM总是提示回复失败。后来通过串口监视,发现,单片机发送6字节的一帧数据,中间会间隔20ms左右,猜测上位机在这20ms期间认为一帧结束,从而导致完整一帧数据被截断。
后来做了以下实验:
1,通过USB转TTL直连电脑,现象依然
2,通过USB转485连接电脑,现象依然(Z-TEK的线)
3,通过USB转RS232,电路板上通过MAX3232连接,现象依然(Z-TEK的线)
4,程序里,关闭所有中断,接收到的数据不做任何处理直接按照协议回复,现象依然。
5,将发送改为DMA发送,现象依然。

问题现在锁定在STM32本身发送数组的地方,发送6个字节,中间会有时间间隔大概20ms。这个问题正常吗?如果不正常应该如何解决?
关键代码如下
        前面只初始化串口,关闭串口中断,关闭其他所有中断
        while(1)
                {
                                unsigned char Rx,i;
                                if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断
                                {
                                                Rx=USART_ReceiveData(USART3);//读取数据后,自动清空标志位
                                                if(SUi.RxCount<SUi.RxSize)
                                                {
                                                        SUi.PRxBuff[SUi.RxCount]=Rx;
                                                        SUi.RxCount++;
                                                }
                                }
                                if(SUi.RxCount==134)
                                                {
                                                                SUi.RxCount=0;
                                                                uctempbuff[0]=0x01;
                                                                uctempbuff[1]=0x01;
                                                                uctempbuff[2]=SUi.PRxBuff[2];
                                                                uctempbuff[3]=0 ;
                                                                ustemp=CRC16_MODBUS(uctempbuff,4);
                                                                uctempbuff[5]=(ustemp>>8)&0xff;//校验
                                                                uctempbuff[4]=ustemp&0xff;
                                                                for(i=0;i<6;i++)
                                                                {
                                                                                UsartSendByte(USART3,uctempbuff);                                               
                                                                }

                                                }

                }

QQ截图20180920095828.png
QQ截图20180920100124.png

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入17汤圆

发表于 2018-9-20 10:27:02 | 显示全部楼层
你的程序是满足if(SUi.RxCount==134),才发送数据。先不要加入什么逻辑。试试
while(1)
{
      //串口发送
}

出0入0汤圆

发表于 2018-9-20 10:35:44 | 显示全部楼层
电脑上的软件运行时也可能有20ms的间隔。(可能涉及操作系统对任务的调度)
最好是拿示波器看下数据波形。

出0入0汤圆

发表于 2018-9-20 11:12:05 | 显示全部楼层
发送期间关闭中断__disable_irq()试试,看看是不是有中断打断发送过程了

出0入4汤圆

 楼主| 发表于 2018-9-20 11:24:13 | 显示全部楼层
w282529350 发表于 2018-9-20 11:12
发送期间关闭中断__disable_irq()试试,看看是不是有中断打断发送过程了

楼主位写的清楚,所有中断全部关闭,什么都不干

出0入0汤圆

发表于 2018-9-20 11:34:34 | 显示全部楼层
bolizhicheng204 发表于 2018-9-20 11:24
楼主位写的清楚,所有中断全部关闭,什么都不干

抱歉,看的不太仔细。
先确认一下问题吧,统计每次发送6个字节所用的时间,看看是不是都落在正常时间范围内

出0入4汤圆

 楼主| 发表于 2018-9-20 11:35:29 | 显示全部楼层
本帖最后由 bolizhicheng204 于 2018-9-20 11:55 编辑

进一步实验结果,根据发送内容慢慢排除,现在结果如下:
什么事情都不干,每100ms发一个6字节数据,用sscom5.13.1.exe 接收发现:如果6个字节没有0,正常,如果中间有一个0,就会出现15ms左右的延时。然后观察原子XCOM进行IAP时的数据记录,几乎所有数据出错的地方,都是在有0的时候。再次分析上位机监视的数据,6个字节要100ms左右,也不正常然后,用示波器看,不管发送什么数据,波形都 非常正常!!没有问题。
初步结论:Windows在做串口数据接收的时候,时间误差很大,按照超时进行帧结束判断造成这种现象。(说实话刚开始想到是上位机的误差,但没想到误差这么大)

所以,强烈建议原子哥XCOM在协议发送文件的时候,要加上超时判断帧结束的参数




QQ图片20180920112635.png
QQ图片20180920115530.png

出0入475汤圆

发表于 2018-9-20 12:50:43 来自手机 | 显示全部楼层
抱歉我还是有点没看明白,你是说mcu发送出只要内容有0就会导致上位机接收到的数据有延迟吗?如果是那么只是上位机软件本身的问题而已吧,因为他对数据内容做了判断处理等等,而不是纯粹的透明接受而已,可以换串口工具验证吧

出0入4汤圆

 楼主| 发表于 2018-9-21 08:41:00 | 显示全部楼层
1a2b3c 发表于 2018-9-20 12:50
抱歉我还是有点没看明白,你是说mcu发送出只要内容有0就会导致上位机接收到的数据有延迟吗?如果是那么只是 ...

是这个意思,一共用了三个工具:1原子的XCOM,数据正确但是上位机显示失败。2、Device Monitoring Studio监视发送内容也是中间数据会有15ms的间隔。3sscom5.13.1.exe 什么都不做只让单片机发送数据也是有间隔。
但是,用示波器看过了,单片机没问题。就是电脑、上位机的原因

出0入0汤圆

发表于 2018-9-21 09:50:42 | 显示全部楼层
15mS间隔就断包,没必要把包间时间缝隙搞这么小,可以设置成50mS以上甚至上百个mS
我常用的做法是异步接受,或者够了一个包的字节数量,或者Timeout了(这个包总时间一般要到几百个mS或者一两秒),判包结束,再判包的好坏

出0入475汤圆

发表于 2018-9-21 11:14:14 | 显示全部楼层
这个问题我很早就说了,不是15ms,而是16.6666666ms
只要电脑调用的delay小于16.6666ms都是16.666

出50入58汤圆

发表于 2018-9-21 12:35:23 来自手机 | 显示全部楼层
1a2b3c 发表于 2018-9-21 11:14
这个问题我很早就说了,不是15ms,而是16.6666666ms
只要电脑调用的delay小于16.6666ms都是16.666 ...

为什么呢,60Hz?

出0入234汤圆

发表于 2018-9-26 22:43:04 | 显示全部楼层
我测试了下, 20ms是没问题的,15ms的间隔则会偶尔出错,但是基本可以接受。当延时为10ms的时候,出错概率就比较高了。
所以建议你在15~20ms的间隔发送一个包,是比较好的一个时间间隔
注意,这是在115200波特率的条件下测试的。
如果波特率更高,理论上可以更小延时。

测试响应.png
10ms结果.png
15ms结果.png
20ms结果.png

测试代码: 战舰&amp;精英_XCOM V2.1协议传输测试.rar (182.28 KB)

出0入4汤圆

 楼主| 发表于 2018-9-27 11:14:56 | 显示全部楼层
正点原子 发表于 2018-9-26 22:43
我测试了下, 20ms是没问题的,15ms的间隔则会偶尔出错,但是基本可以接受。当延时为10ms的时候,出错概率 ...

非常感谢!
已经测试过了。原因找到了,我的程序有点瑕疵。这不是最主要的,最主要的是:USB转串口线有问题!线是Z-TEK的线,这个线是论坛里推荐的,所以一直没太在意。多谢

出0入0汤圆

发表于 2018-12-25 18:36:39 | 显示全部楼层
看不懂
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 03:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表