OpenEdv-开源电子网

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

USART_RX_BUF中为什么会接收很多0

[复制链接]

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2022-6-23
在线时间
15 小时
发表于 2022-8-4 09:51:58 | 显示全部楼层 |阅读模式
1金钱
USART_RX_BUF中为什么会接收很多0,我并没有发送0。有大神知道为什么吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2022-6-23
在线时间
15 小时
 楼主| 发表于 2022-8-4 10:04:09 | 显示全部楼层
USART_RX_BUF明明没有值,为什么还是会返回,问题出在哪里
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2017-3-7
在线时间
1687 小时
发表于 2022-8-4 10:19:56 | 显示全部楼层
数组初始化一般默认都是0,所以是不是看的默认值。。。
回复

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2022-6-23
在线时间
15 小时
 楼主| 发表于 2022-8-4 10:34:59 | 显示全部楼层
a5820736 发表于 2022-8-4 10:19
数组初始化一般默认都是0,所以是不是看的默认值。。。

之前都是正常的接收
回复

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2088
金钱
2088
注册时间
2021-7-17
在线时间
653 小时
发表于 2022-8-4 10:38:57 | 显示全部楼层
把这个数组缓冲改大些
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8608
金钱
8608
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-8-4 10:44:31 | 显示全部楼层
程序弄上来,你如何确定是刚收到的、还是以前收到的值、还是初始值?
专治疑难杂症
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2022-8-4 11:11:40 | 显示全部楼层
很简单,因为串口是默认电平是1,信号电平是0,有点类似开漏的感觉.
所以当你其中一个设备启动完成,而另一个没有启动成功时(一般是没供电),
就会通过串口线寄生电流让芯片短暂的获得一个启动的电压,然后反复重启.
这样你这边启动完成的就会收到很多0了.
说到底就是接收的串口线被低电平干扰到了,可以做个上拉电阻或者串口通信线上串联个电阻来减少或避免这种情况
回复

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2022-6-23
在线时间
15 小时
 楼主| 发表于 2022-8-4 11:35:54 | 显示全部楼层
LcwSwust 发表于 2022-8-4 10:44
程序弄上来,你如何确定是刚收到的、还是以前收到的值、还是初始值?

                                else if(USB_USART_RX_BUF[0]==0xef){//激光器按照原命令执行
                                               
                                                //usb_printf("\r\n您发送的消息长度为:%d\r\n\r\n",len1);
                                                HAL_UART_Transmit_IT(&huart4,(uint8_t*)USB_USART_RX_BUF,len1);
                                                while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET);                //等待发送结束
                                                HAL_Delay(10);//发送数据前要有个延时
                                                len2=USART_RX_STA&0x3FFF;
                                                CDC_Transmit_HS(USART_RX_BUF, len2);
                                                USART_RX_STA=0;
                                          USB_USART_RX_STA=0;       

大哥,我刚测量一下,我发送数据,器件返回命令是正确的,然后我接受,再发送到电脑就会C出现问题。
回复

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2022-6-23
在线时间
15 小时
 楼主| 发表于 2022-8-4 11:37:27 | 显示全部楼层
ChenRyan 发表于 2022-8-4 10:38
把这个数组缓冲改大些

谢谢,我试一下,但是我定义200,应该够大吧
回复

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2022-6-23
在线时间
15 小时
 楼主| 发表于 2022-8-4 11:38:41 | 显示全部楼层
聚东风 发表于 2022-8-4 11:11
很简单,因为串口是默认电平是1,信号电平是0,有点类似开漏的感觉.
所以当你其中一个设备启动完成,而另一个 ...

大哥,请问一下如果硬件已经定型,软件上我要做哪些修改
回复

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2022-6-23
在线时间
15 小时
 楼主| 发表于 2022-8-4 11:40:10 | 显示全部楼层
想问下大家,中断接收我用的正点原子的程序,下面是主程序,麻烦兄弟们帮我看看
if(USB_USART_RX_STA&0x8000)
                        {                                          
                                len1=USB_USART_RX_STA&0x3FFF;//得到此次接收到的数据长度
                                if(USB_USART_RX_BUF[0]==0x8f)
                                {
                                       
                                                HAL_UART_Transmit_IT(&huart2,(uint8_t*)USB_USART_RX_BUF,len1);
                                                while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET);                //等待发送结束
                                                HAL_Delay(10);//发送数据前要有个延时
                                                               
                                                len2=USART_RX_STA&0x3FFF;
                                                CDC_Transmit_HS(USART_RX_BUF, len2);       
//                                                if(USB_USART_RX_BUF[1]==0x72){
//                                                        for(i=0;i<len1;i++){
//                                                                        RxBuffer2_1[i]=USB_USART_RX_BUF[i];
//                                                        }
//                                                }
                                                USART_RX_STA=0;//将串口寄存器清空,不然串口发送时一直是上次的数据
                                                USB_USART_RX_STA=0;
                                       
                                }
                                else if(USB_USART_RX_BUF[0]==0xef){//激光器按照原命令执行
                                               
                                                //usb_printf("\r\n您发送的消息长度为:%d\r\n\r\n",len1);
                                                HAL_UART_Transmit_IT(&huart4,(uint8_t*)USB_USART_RX_BUF,len1);
                                                while(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_TC)!=SET);                //等待发送结束
                                                HAL_Delay(10);//发送数据前要有个延时
                                                len2=USART_RX_STA&0x3FFF;
                                                CDC_Transmit_HS(USART_RX_BUF, len2);
                                                USART_RX_STA=0;
                                          USB_USART_RX_STA=0;       
                                }
回复

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2022-6-23
在线时间
15 小时
 楼主| 发表于 2022-8-4 11:42:33 | 显示全部楼层
下面是接收只有,最后9位,从EDFA开始是正确的00 00 01 2C 00 00 00 00 00 00 02 26 03 84 00 23 00 00 00 F7 77 D8 00 00 00 00 00 FC 8E 9B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 B6 ED FA 39 FF 00 D5 04 54 00
回复

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2022-6-23
在线时间
15 小时
 楼主| 发表于 2022-8-4 11:43:30 | 显示全部楼层
时而正确,时而不正确,请教一下大家是哪里问题
ED FA 03 FF 40 29 ED FA 03 FF 40 29 ED FA 03 FF 40 29 ED FA 03 FF 40 29 ED FA 03 FF 40 29 ED FA 03 FF 40 29 ED FA 39 FF 00 D5 04 54 00 00 00 01 22 00 00 00 00 00 00 02 26 03 84 00 21 00 00 00 F7 76 DD 00 00 00 00 01 29 74 B8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 DF ED FA 39 FF 00 D5 04 54 00
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8608
金钱
8608
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-8-4 11:58:25 | 显示全部楼层
zmzxcc 发表于 2022-8-4 11:35
else if(USB_USART_RX_BUF[0]==0xef){//激光器按照原命令执行
                                               
                                                //usb_printf("\r\n您 ...

我表示一头雾水,我猜测,你的单片机是做了一个USB转串口,USB收到的数据发往串口4,串口4收到的数据发往USB,
所以目前也没确定是串口4收到的数据本就有多个0还是USB发出数据时发多了0?

专治疑难杂症
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2022-8-4 15:42:20 | 显示全部楼层
你试下RX的引脚让他上拉不行吗?先试试看啊
回复

使用道具 举报

11

主题

2141

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4847
金钱
4847
注册时间
2015-1-10
在线时间
607 小时
发表于 2022-8-5 09:15:11 | 显示全部楼层
你用PC接串口别发0x00试试,串口中断接收到0x00后断点看一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-26 18:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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