OpenEdv-开源电子网

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

stm32f103收发数据第一次丢失尾数,之后错位

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-18
在线时间
5 小时
发表于 2018-7-18 22:46:00 | 显示全部楼层 |阅读模式
void NVIC_Configuration(void)
{
          NVIC_InitTypeDef NVIC_InitStructure;
       
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
                NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;           //éèÖÃ′®¿ú2ÖD¶Ï
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;    //ÇàÕ¼óÅÏè¼¶3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;          //×óóÅÏè¼¶3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //IRQí¨μàê1Äü
    NVIC_Init(&NVIC_InitStructure);         //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
          
}
void Uart1_Init(void)
{
          GPIO_InitTypeDef GPIO_InitStructure;       
         USART_InitTypeDef USART_InitStructure;
          USART_DeInit(USART2);     //¸′λ  
       
   // RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB1Periph_USART2,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
          //êy¾Y·¢Ëí¿úTXD  PA2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;               //Ñ¡ÖD′®¿úĬèÏêä3ö1ü½Å         
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //¶¨òåêä3ö×î′óËùÂê
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//¶¨òå1ü½Å2μÄģ꽠 
    GPIO_Init(GPIOA, &GPIO_InitStructure);           //μ÷óÃoˉêy£¬°Ñ½á11ìå2Îêyêäèë½øDD3õê¼»ˉ                  
    //êy¾Y½óêÕ¿úRXD  PA3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = 115200; //2¨ìØÂê
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //êy¾Yλ8λ
    USART_InitStructure.USART_StopBits = USART_StopBits_1;        //í£Ö1λ1λ
    USART_InitStructure.USART_Parity = USART_Parity_No;                //D£Ñéλ ÎT
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTá÷¿ØÖÆ
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                //ê1Äü½óêÕoí·¢Ëíòy½Å
    USART_Init(USART2, &USART_InitStructure);

    USART_ClearFlag(USART2,USART_FLAG_TC);
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);   //′ò¿a½óêüÖD¶Ï
    USART_ITConfig(USART2, USART_IT_TXE, ENABLE);    //′ò¿a·¢ËíÖD¶Ï
                //USART_ITConfig(USART2, USART_IT_IDLE,ENABLE);    //′ò¿a¿ÕÏDÖD¶Ï
                //USART_ClearITPendingBit(USART2,USART_IT_RXNE); //Çå3yÖD¶Ï±êÖ¾

                USART_Cmd(USART2, ENABLE);           //¿aÆôUSART2
                //DelayTime1(10);
                NVIC_Configuration();
}
/******
zigbeeÖ®¼äμÄí¨DÅ2aêÔ′úÂë
*******/
//½óêüêy¾Y


#define Max_BUFF_Len 1
unsigned char Uart2_Buffer[Max_BUFF_Len];
unsigned int Uart2_Rx=0;
void USART2_IRQHandler()
{
       
        if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) // 中断产生
        {
             int i;                          //1
            Uart2_Rx=0;               //2
                Uart2_Buffer[Uart2_Rx++] = USART2->DR&0x01FF;  //USART_ReceiveData(USART2);     //接受数据到Uart2_Buffer缓存区
                //Uart2_Rx++;
          USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清中断标志
                    for(i=0; i<sizeof(Uart2_Buffer); i++)  
                     {
                                    //while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET){}
                                    while(USART_GetFlagStatus(USART2, USART_IT_TXE) == RESET){}
                                    USART_SendData(USART2,Uart2_Buffer[i]);
                                   //USART_ClearITPendingBit(USART2,USART_IT_RXNE);
                     }
                if(Uart2_Rx == Max_BUFF_Len)
                {
                                Uart2_Rx=0;                                   //重新接受
    }
        我在运行上面程序时,串口助手第一次        打印数据缺了最后一位,之后几次打印都是把上一次的最后一位打印到了下一次的第一位然后依次错开。试了好多种方法一直老样子。无论是删除1,2,改变1,2位置放到中断外面,        还是清中断位置,改for循环之类的都不会变化。我哪里出错啦?        (新手小白,会的详细一点,拜托了,也没什么积分)         

串口助手显示

串口助手显示
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-18
在线时间
5 小时
 楼主| 发表于 2018-7-20 08:55:28 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-7-20 11:13:05 | 显示全部楼层

回帖奖励 +1 金钱

首先你要知道32里是发送还是接收出问题。      用32发一串5位以上的数据看看,如果缺失则为发送问题,如果未缺失则为接收问题,确定问题大方向再动手解决
猪猪熊呢?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-7-20
在线时间
4 小时
发表于 2018-7-20 14:25:48 | 显示全部楼层
本帖最后由 潜入狮 于 2018-7-20 14:55 编辑

while(USART_GetFlagStatus(USART2, USART_IT_TXE) == RESET)  改成 while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); 试试?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-18
在线时间
5 小时
 楼主| 发表于 2018-7-20 19:09:19 | 显示全部楼层
323232 发表于 2018-7-20 11:13
首先你要知道32里是发送还是接收出问题。      用32发一串5位以上的数据看看,如果缺失则为发送问题,如果 ...

应该是发送问题,我发了串口助手的显示图片,他第一次发的时候最后一位没发,在第二次发的时候的首位发了,所以接受是没问题的。然后我就想干脆最后一位不用,把第一位清掉,但是还是老样子........
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-18
在线时间
5 小时
 楼主| 发表于 2018-7-20 19:10:16 | 显示全部楼层
潜入狮 发表于 2018-7-20 14:25
while(USART_GetFlagStatus(USART2, USART_IT_TXE) == RESET)  改成 while(USART_GetFlagStatu ...

试过了不行,换成了这个数据都不出来了
回复 支持 反对

使用道具 举报

9

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2015-5-19
在线时间
132 小时
发表于 2018-7-21 10:17:12 | 显示全部楼层
lu1997 发表于 2018-7-20 19:10
试过了不行,换成了这个数据都不出来了

一、建议先把所有数据接收到后,放在一个数组里面,然后再发送到串口,不然你在接收中断函数里面处理的时候,下一个发送的数据已经到串口了,可能没有时间进行处理,从而导致错误。你现在的程序是接收到一个数据,就发送到串口,可能导致错误。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-18
在线时间
5 小时
 楼主| 发表于 2018-7-23 19:16:27 | 显示全部楼层
现在发的时候不错位了,有点不太稳定,我应该是标志位没加,他分不清第一个和最后一个,我试着用环形队列写写
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 05:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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