OpenEdv-开源电子网

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

求助,开启中断接收后,只能接收一个字节

[复制链接]

32

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1123
金钱
1123
注册时间
2021-3-21
在线时间
172 小时
发表于 2022-11-19 14:56:56 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 Amiao 于 2022-11-19 15:15 编辑

代码如图:
只能接收到到一个括号
,数据应该是{Y000},为什么只有一边括号?

下载 (1).png
下载.png
慎独
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
发表于 2022-11-19 15:05:26 | 显示全部楼层
这个原因,如下图所示
回复

使用道具 举报

32

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1123
金钱
1123
注册时间
2021-3-21
在线时间
172 小时
 楼主| 发表于 2022-11-19 15:15:42 | 显示全部楼层
nashui_sx 发表于 2022-11-19 15:05
这个原因,如下图所示

对不起,我什么都没看到
慎独
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2022-11-19 15:25:48 | 显示全部楼层
可能楼上那位没看到楼主的图。
什么情况下出现这种情况?是否每次都这样?
RxCounter1什么时候清零的?ReceiveState2=1之后作了什么处理?
专治疑难杂症
回复

使用道具 举报

32

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1123
金钱
1123
注册时间
2021-3-21
在线时间
172 小时
 楼主| 发表于 2022-11-19 15:36:07 | 显示全部楼层
LcwSwust 发表于 2022-11-19 15:25
可能楼上那位没看到楼主的图。
什么情况下出现这种情况?是否每次都这样?
RxCounter1什么时候清零的?Re ...

每次接收都只有左边的括号。RxCounter在超出接收长度后清零。ReceiveState等于1后在另一个函数中解析收到的数据。
慎独
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2022-11-19 15:54:25 | 显示全部楼层
Amiao 发表于 2022-11-19 15:36
每次接收都只有左边的括号。RxCounter在超出接收长度后清零。ReceiveState等于1后在另一个函数中解析收到 ...

解析时也应对RxCounter1清零,否则下一帧数据到来就不是从[0]开始存了。
专治疑难杂症
回复

使用道具 举报

32

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1123
金钱
1123
注册时间
2021-3-21
在线时间
172 小时
 楼主| 发表于 2022-11-19 15:59:42 | 显示全部楼层
LcwSwust 发表于 2022-11-19 15:54
解析时也应对RxCounter1清零,否则下一帧数据到来就不是从[0]开始存了。

有清零的。
慎独
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2022-11-19 16:05:07 | 显示全部楼层
本帖最后由 LcwSwust 于 2022-11-19 16:06 编辑

那就用示波器监测一下接收脚波形,看是否字节之间有较大间隔,以及数据是否正确。
专治疑难杂症
回复

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2022-11-19 16:40:59 | 显示全部楼层
企业微信截图_16688471514028.png 一个1一个2。确定逻辑是这样?确定是这样的话就检查1什么时候清0的。



回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2022-11-19 19:20:46 | 显示全部楼层
看起来不像是RxCounter1清零的问题啊 因为数组第二个元素也存的是{
只开串口接收中断 不开空闲中断呢? 通过检测}字符再进行后续处理一般空闲中断都是配DMA用的
回复

使用道具 举报

13

主题

166

帖子

0

精华

高级会员

Rank: 4

积分
791
金钱
791
注册时间
2018-12-19
在线时间
163 小时
发表于 2022-11-20 01:16:19 | 显示全部楼层
没有清除接收不空中断标志位吧,空闲中断的时候清除空闲中断标志位了,接收不空中断没有清除接收不空中断标志位。
回复

使用道具 举报

32

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1123
金钱
1123
注册时间
2021-3-21
在线时间
172 小时
 楼主| 发表于 2022-11-20 14:47:02 | 显示全部楼层
wklhwkl 发表于 2022-11-19 16:40
一个1一个2。确定逻辑是这样?确定是这样的话就检查1什么时候清0的。

对不起对不起,应该都是2
慎独
回复

使用道具 举报

32

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1123
金钱
1123
注册时间
2021-3-21
在线时间
172 小时
 楼主| 发表于 2022-11-20 14:47:24 | 显示全部楼层
babyrabbit 发表于 2022-11-19 19:20
看起来不像是RxCounter1清零的问题啊 因为数组第二个元素也存的是{
只开串口接收中断 不开空闲中断呢? 通 ...

没有用dma,我明天再检查一下
慎独
回复

使用道具 举报

29

主题

167

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1011
金钱
1011
注册时间
2021-7-26
在线时间
184 小时
发表于 2022-11-20 15:23:06 | 显示全部楼层
要不检测接收用
USART_GetITStatus(USART1, USART_IT_RXNE) != RESET
试试?检测读取状态的函数
回复

使用道具 举报

32

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1123
金钱
1123
注册时间
2021-3-21
在线时间
172 小时
 楼主| 发表于 2022-11-21 10:31:37 | 显示全部楼层
854278507 发表于 2022-11-20 01:16
没有清除接收不空中断标志位吧,空闲中断的时候清除空闲中断标志位了,接收不空中断没有清除接收不空中断标 ...

接收非空中断标志位在读的时候就已经清0了
慎独
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2022-11-21 10:49:57 | 显示全部楼层
给你个例子参考下:
这是接收代码:
void uart1_rx_irq(void)
{
        uint8_t chTemp = 0;

    //接收
        if(SET == LL_USART_IsActiveFlag_RXNE_RXFNE(USART1)){
                //USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                chTemp=LL_USART_ReceiveData8(USART1);
        uartx_rx(&s_tUart1Parameter,chTemp);
        }
}
这是发送代码:
void uart1_tx_irq(void)
{
    fsm_rt_t    tTemp = fsm_rt_err;
    uint8_t     chTemp = 0;
    //发送
    if(SET == LL_USART_IsActiveFlag_TC(USART1)){
        LL_USART_ClearFlag_TC(USART1);
        tTemp = uartx_tx(&s_tUart1Parameter,&chTemp);
        switch(tTemp){
            case fsm_rt_on_going:
                LL_USART_TransmitData8(USART1, chTemp);
                break;
            case fsm_rt_cpl:
                LL_USART_DisableIT_TC(USART1);
                break;
            case fsm_rt_err:
                LL_USART_DisableIT_TC(USART1);
                break;
            default:
                FSM_DEFAULT_ACTION();
        }
    }
}
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

32

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1123
金钱
1123
注册时间
2021-3-21
在线时间
172 小时
 楼主| 发表于 2022-11-22 14:06:33 | 显示全部楼层
LcwSwust 发表于 2022-11-19 16:05
那就用示波器监测一下接收脚波形,看是否字节之间有较大间隔,以及数据是否正确。

我用串口助手读了一下数据,是正常的。
慎独
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2022-11-22 14:24:40 | 显示全部楼层
Amiao 发表于 2022-11-22 14:06
我用串口助手读了一下数据,是正常的。

工程传上来
专治疑难杂症
回复

使用道具 举报

32

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1123
金钱
1123
注册时间
2021-3-21
在线时间
172 小时
 楼主| 发表于 2022-11-22 14:37:38 | 显示全部楼层

串口部分  
微信图片_20221122143111.png
微信图片_20221122143103.png
微信图片_20221122143043.png
慎独
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2022-11-22 15:03:49 | 显示全部楼层

这些代码看着没问题,要不你试一下将收到的数据直接发出来,或通过另一个串口发出来,或者将RxCounter2发出来.
专治疑难杂症
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 22:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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