OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 886|回复: 6

IAP串口接收。发一字符串,分两段显示,第二个字符缺失,效果如图

[复制链接]

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2014-10-16
在线时间
41 小时
发表于 2024-2-26 15:03:27 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 待机唤醒 于 2024-2-26 15:07 编辑

简单的只测试了原子哥的IAP的串口接收的这一小段代码,简单的发了四个字符,却分两次显示的,先显示第一个再显示后面的,第二个显示空,啥原因
                 if(USART_RX_CNT)
                {
                        if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
                        {
                                applenth=USART_RX_CNT;
                                oldcount=0;
                                USART_RX_CNT=0;
                for(t=0;t<applenth;t++)
                {
                    printf("USART_RX_BUF=%c\r",USART_RX_BUF[t]);
                  USART_RX_BUF[t]=0;  
                }               
                                printf("用户程序接收完成!\r\n");
                                printf("代码长度:%dBytes\r\n",applenth);

                        }else oldcount=USART_RX_CNT;                       
                }





串口打印如下:
USART_RX_BUF=M
用户程序接收完成!
代码长度:1Bytes
USART_RX_BUF=
USART_RX_BUF=D
USART_RX_BUF=E
用户程序接收完成!
代码长度:3Bytes



最佳答案

查看完整内容[请看2#楼]

接收到1字节后,if(oldcount==USART_RX_CNT)成立,执行 USART_RX_CNT=0; printf("USART_RX_BUF=%c\r",USART_RX_BUF[t]); 在printf期间,收到了第二字节,存入USART_RX_BUF[0],但由于后来执行了 USART_RX_BUF[t]=0; 所以将第二字节给抹杀了。 建议:每隔1ms检测一次USART_RX_CNT,若连续3次以上它都不变,才能认为是帧结束; 目前问题在于检测间隔时间太短。
奋斗才能新生
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8205
金钱
8205
注册时间
2020-5-11
在线时间
3700 小时
发表于 2024-2-26 15:03:28 | 显示全部楼层
接收到1字节后,if(oldcount==USART_RX_CNT)成立,执行
USART_RX_CNT=0;
printf("USART_RX_BUF=%c\r",USART_RX_BUF[t]);
在printf期间,收到了第二字节,存入USART_RX_BUF[0],但由于后来执行了
USART_RX_BUF[t]=0;  
所以将第二字节给抹杀了。

建议:每隔1ms检测一次USART_RX_CNT,若连续3次以上它都不变,才能认为是帧结束;
目前问题在于检测间隔时间太短。
专治疑难杂症
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2014-10-16
在线时间
41 小时
 楼主| 发表于 2024-2-26 15:42:51 | 显示全部楼层
LcwSwust 发表于 2024-2-26 15:27
接收到1字节后,if(oldcount==USART_RX_CNT)成立,执行
USART_RX_CNT=0;
printf("USART_RX_BUF=%c\r",U ...

确实是检测时间太短了,加了个1毫秒延时再判断,数据就正常了,就是堵塞了APP的传输,加定时器又得花一个定时器
奋斗才能新生
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8205
金钱
8205
注册时间
2020-5-11
在线时间
3700 小时
发表于 2024-2-26 15:49:43 | 显示全部楼层
待机唤醒 发表于 2024-2-26 15:42
确实是检测时间太短了,加了个1毫秒延时再判断,数据就正常了,就是堵塞了APP的传输,加定时器又得花一个 ...

USART的空闲中断了解一下
专治疑难杂症
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2014-10-16
在线时间
41 小时
 楼主| 发表于 2024-2-26 16:54:24 | 显示全部楼层
LcwSwust 发表于 2024-2-26 15:49
USART的空闲中断了解一下

加了空闲中断确实可以,再请教个问题,我用指令或者字符串控制IAP更新,都用串口传输的,如何更好的分辨哪个是指令或者字符串,哪个是APP的更新程序
奋斗才能新生
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8205
金钱
8205
注册时间
2020-5-11
在线时间
3700 小时
发表于 2024-2-26 17:03:33 | 显示全部楼层
本帖最后由 LcwSwust 于 2024-2-26 17:06 编辑
待机唤醒 发表于 2024-2-26 16:54
加了空闲中断确实可以,再请教个问题,我用指令或者字符串控制IAP更新,都用串口传输的,如何更好的分辨 ...

那你得自己规划好哦,我不清楚你的协议,所以只能瞎说。
可以通过帧长度、某个特定字节来区分;
可以结合状态机,比如:
默认是接收指令状态,收到IAP更新指令后进入更新状态,此后收到的数据就存入FLASH,若1秒内没收到新的数据,则回到指令状态。


专治疑难杂症
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2014-10-16
在线时间
41 小时
 楼主| 发表于 2024-2-26 17:12:22 | 显示全部楼层
LcwSwust 发表于 2024-2-26 17:03
那你得自己规划好哦,我不清楚你的协议,所以只能瞎说。
可以通过帧长度、某个特定字节来区分;
可以结 ...

好的,感谢感谢
奋斗才能新生
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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