OpenEdv-开源电子网

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

串口3中端接收 数据丢失

[复制链接]

10

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2012-11-16
在线时间
6 小时
发表于 2013-1-30 13:25:02 | 显示全部楼层 |阅读模式
一个串口摄像头连接到PB10和PB11,串口摄像头 发送指令(十六进制)56 00 26 00 返回指令76 00 26 00+版本信息
其他的和原子串口实验一样,只是在usart里加入了usart3的代码,现在问题:

串口接收的数据不全   数组中的数据,只是接收组后面的数据
void USART3_IRQHandler(void)
{
u8 res;
     u8 i=0;
     if(USART3->SR&(1<<5))   //
    {      
           res =USART3->DR;           
           USART3_RX_BUF[USART3_RX_STA&0x3f]=res;   先把数据放到数组里   然后再main中 发送到 串口1  用串口助手接收  数据只是后半部分,
      USART3_RX_STA++;
           USART1->DR=res;       接收的直接在发送到 串口1  用串口助手接收  数据时完整的      
     }    
}
main()
{
///////省略一部分、、。。。。。。。。。。

while(1)
            {    
               len=USART3_RX_STA&0x3f;
//              printf("len=%d",len);
                for(i=0;i<len;i++)           
    {              
     USART1->DR=USART3_RX_BUF;                  数组里发送到串口1                                        
       while((USART1->SR&0X40)==0);//等待发送结束                                   
   
}
这个是串口助手显示


只是长数据 (大概不到80个)事这样  但是如果短数据的话  就没问题了  

但是  我需要的数据时很长的的,请原子哥看下   






未命名2.jpg
未命名1.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-1-30 16:06:17 | 显示全部楼层
USART3_RX_STA 这个发送完 清零了吗, 

另外建议 接收到数组  到一定数量定义一个标志, 这样主函数再往外发。 发完清标志
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-30 17:34:40 | 显示全部楼层
如1楼说的,你的STA清零了么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2012-11-16
在线时间
6 小时
 楼主| 发表于 2013-1-31 09:30:42 | 显示全部楼层
回复【3楼】正点原子:

如1楼说的,你的STA清零了么?

---------------------------------
 清零了 在for()下面请零的 ,还是只能显示最后几个字符
while(1)
    {    
       len=USART3_RX_STA&0x3f;
//       printf("len=%d\n\n",len);
        for(i=0;i<len;i++)           
{              
USART1->DR=USART3_RX_BUF;                                                        
    while((USART1->SR&0X40)==0);//等待发送结束                                   

        USART3_RX_STA=0; delay——ms(10000);            
 }
回复 支持 反对

使用道具 举报

10

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2012-11-16
在线时间
6 小时
 楼主| 发表于 2013-1-31 09:33:06 | 显示全部楼层
回复【2楼】aleda303:

USART3_RX_STA 这个发送完 清零了吗, 
另外建议 接收到数组  到一定数量定义一个标志, 这样主函数再往外发。 发完清标志

---------------------------------
标志?我新手啊 ,能不能详细点?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-31 10:29:54 | 显示全部楼层
回复【4楼】a2696026:
---------------------------------
你这代码有问题.
清零不是这么清的,你参考下我们的串口例程啊.
看看我是怎么清的.
你这么清,然后延时1s,十分不可取.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-1-31 13:12:47 | 显示全部楼层
定义全局变量,
volatile BOOL RCOKFlag=false;

中断里面 加一条 
if(USART3_RX_STA >= NUM) //NUM为你要接收的数量
  RCOKFlag = TRUE;

主函数里面:
while(1)
{
....其他处理

if(RCOKFlag)
{
    发送出去NUM个 

}

 把延时去掉
....其他处理

}
回复 支持 反对

使用道具 举报

10

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2012-11-16
在线时间
6 小时
 楼主| 发表于 2013-1-31 15:51:52 | 显示全部楼层
int volatile RCOKFlag=0;    
void USART3_IRQHandler(void)
{
u8 res;
 
     if(USART3->SR&(1<<5))   //
    {      
           res =USART3->DR;           
           USART3_RX_BUF[USART3_RX_STA&0x3f]=res;   
      USART3_RX_STA++;
//           USART1->DR=res;  
           if(USART3_RX_STA>=40)
           {
               RCOKFlag=1; 
//              *RX_BUF=*USART3_RX_BUF;
             USART3_RX_STA=0;//接收数据错误,重新开始接收    
           }
     }    
}

while(1)
    {   
        if(RCOKFlag)
        { 
          len=USART3_RX_STA&0x3f;
                for(i=0;i<len;i++)           
        {              
            USART1->DR=USART3_RX_BUF;                                                        
               while((USART1->SR&0X40)==0);//等待发送结束                                   
       
            USART3_RX_STA=0;            // 最后清0
    }

但是接收到的数据只是部分 而且不连贯







回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-22 01:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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