OpenEdv-开源电子网

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

求助:关于stm32F103,串口接收数据问题

[复制链接]

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-12-10
在线时间
11 小时
发表于 2016-12-10 10:36:00 | 显示全部楼层 |阅读模式
1金钱
有两颗103的ARM,一颗使用USART3,一颗使用UART4;
第一颗的USART3发送数据通过PCB到DP接口,然后走DP线,到另外一个PCB的DP接口,然后进另一颗的UART4接收数据;
在波特率设置为9600或者以上时,出现UART4接收数据偶尔丢字节,通过加计数,发现UART4进入中断的次数和少于USART3发送次数;
(发送数据按自定义协议发送,有包头和Checksum;波特率为9600时,USART3每隔200MS发送一次数据,每次7个字节,发送1000次;UART4收到数据,发现收到数据次数偶尔为998或者999,有时候正常,进中断的次数计数偶尔为6998或者6999,正常应该为:7000。)
修改波特率为2400,发送接收数据正常(测试几W次,暂未发现异常)

麻烦大神帮忙看看会是什么问题

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

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-12-10
在线时间
11 小时
 楼主| 发表于 2016-12-10 14:07:11 | 显示全部楼层
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-12-10
在线时间
11 小时
 楼主| 发表于 2016-12-10 16:08:08 | 显示全部楼层
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-12-10
在线时间
11 小时
 楼主| 发表于 2016-12-12 10:51:07 | 显示全部楼层
  来个大神帮下忙啊,困在这好几天了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-12-12 20:49:13 | 显示全部楼层
说明是串口速度高才出现数据丢失,可能的问题是中断服务程序写的不好,处理不过来
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-12-10
在线时间
11 小时
 楼主| 发表于 2016-12-13 11:12:15 | 显示全部楼层
正点原子 发表于 2016-12-12 20:49
说明是串口速度高才出现数据丢失,可能的问题是中断服务程序写的不好,处理不过来

感谢原子大大的回复。  中断服务函数如下:


void UART4_IRQHandler(void)
{
        BYTE B_Uart4RcvData;

        if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
        {
                USART_ClearITPendingBit(UART4, USART_IT_RXNE);
                B_Uart4RcvData = USART_ReceiveData(UART4);
                RecvTimes++;

                if(B_Uart4Lock == UART_UNLOCK)
                {
                        if(W_Uart4RecvIndex == W_Uart4ProcessIndex)
                        {
                                W_Uart4RecvIndex    = 0;
                                W_Uart4ProcessIndex = 0;
                                W_Uart4Counter      = 0;
                        }
                }
                if(W_Uart4RecvIndex >= Rx4BufferSize)
                {
                        W_Uart4RecvIndex = 0;
                }
                RxBuffer4[W_Uart4RecvIndex++] = B_Uart4RcvData;

        if(USART_GetFlagStatus(UART4,USART_FLAG_ORE) == SET) //溢出
    {
        USART_ClearFlag(UART4,USART_FLAG_ORE); //读SR
        USART_ReceiveData(UART4); //读DR
        Flag++ ;
    }


        }
}
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-12-10
在线时间
11 小时
 楼主| 发表于 2016-12-13 11:12:27 | 显示全部楼层
正点原子 发表于 2016-12-12 20:49
说明是串口速度高才出现数据丢失,可能的问题是中断服务程序写的不好,处理不过来

感谢原子大大的回复。  中断服务函数如下:


void UART4_IRQHandler(void)
{
        BYTE B_Uart4RcvData;

        if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
        {
                USART_ClearITPendingBit(UART4, USART_IT_RXNE);
                B_Uart4RcvData = USART_ReceiveData(UART4);
                RecvTimes++;

                if(B_Uart4Lock == UART_UNLOCK)
                {
                        if(W_Uart4RecvIndex == W_Uart4ProcessIndex)
                        {
                                W_Uart4RecvIndex    = 0;
                                W_Uart4ProcessIndex = 0;
                                W_Uart4Counter      = 0;
                        }
                }
                if(W_Uart4RecvIndex >= Rx4BufferSize)
                {
                        W_Uart4RecvIndex = 0;
                }
                RxBuffer4[W_Uart4RecvIndex++] = B_Uart4RcvData;

        if(USART_GetFlagStatus(UART4,USART_FLAG_ORE) == SET) //溢出
    {
        USART_ClearFlag(UART4,USART_FLAG_ORE); //读SR
        USART_ReceiveData(UART4); //读DR
        Flag++ ;
    }


        }
}
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-12-10
在线时间
11 小时
 楼主| 发表于 2016-12-13 11:13:25 | 显示全部楼层
正点原子 发表于 2016-12-12 20:49
说明是串口速度高才出现数据丢失,可能的问题是中断服务程序写的不好,处理不过来

中断服务函数中,只是接收数据存进buff;还有一些相关全局变量的赋值
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-12-10
在线时间
11 小时
 楼主| 发表于 2016-12-15 11:10:15 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-12-17 21:17:14 | 显示全部楼层
fengye00 发表于 2016-12-13 11:13
中断服务函数中,只是接收数据存进buff;还有一些相关全局变量的赋值

这看上去也没什么问题哦
用外部ttl串口模块,监控下传输数据线上的数据吧,看看是否干扰出错了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-12-10
在线时间
11 小时
 楼主| 发表于 2017-1-6 16:52:37 | 显示全部楼层
正点原子 发表于 2016-12-17 21:17
这看上去也没什么问题哦
用外部ttl串口模块,监控下传输数据线上的数据吧,看看是否干扰出错了

找到问题了,是因为有个外部中断一直在发生导致的; 现在需要解决,但是外部中断的优先级是要高于串口的,而且收到中断,必须在中断服务函数中进行处理,需要几ms的时间,不能收下来再去主环处理。请问原子大大,有什么好的处理方式吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 06:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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