打印

STM32 USART2接收多个时字符错位?求各路高手指教,小弟感激

[复制链接]
2825|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 z755924843 于 2013-7-30 08:22 编辑

如题 小弟弄了好几天了 上网找了好多资料,最后还是没有办法 ,只能求助论坛里的各位大侠了。
我用的是STM32f101,两片STM32利用USART2进行通信,发送函数只是简单的sendchar()
USART2配置函数如下
void USART2_Configuration(void)
{
        USART_InitTypeDef USART_InitStructure;//①定义结构体
        GPIO_InitTypeDef GPIO_InitStructure;
               
        /* USARTx configured as follow:
        - BaudRate = 4800 baud  
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
         */       

        /*②串口参数配置,结构体赋值*/
        USART_InitStructure.USART_BaudRate = 4800;                                   /*设置波特率为4800*/
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;  /*设置数据位为8
位*/
        USART_InitStructure.USART_StopBits = USART_StopBits_1;           /*设置停止位为1位*/
        USART_InitStructure.USART_Parity = USART_Parity_No;                   /*无奇偶校验*/         
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /*没有硬件流控*/
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;          
/*发送与接收*/
        /*完成串口的时钟配置、GPIO配置,根据上述参数初始化并使能*/
       
/******************************************************************************
****/
       
/******************************************************************************
****/       
        /*③使能时钟RX,TX,USART2*/
        /* Enable GPIO clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        //USART1-GPIO_Pin_9,GPIO_Pin_10
        /* Enable UART clock */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//USART1

        /*④配置USART的GPIO,GPIOA_2 = Tx,GPIOA_3 = Rx*/
        /* Configure USART Tx as alternate function push-pull */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA , &GPIO_InitStructure);
       
        /* Configure USART Rx as input floating */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;
        GPIO_Init(GPIOA , &GPIO_InitStructure);
        /*⑤USART初始化*/
        /* USART configuration */
        USART_Init(USART2, &USART_InitStructure);
        /*⑥USART使能*/               
    /* Enable USART */
        USART_Cmd(USART2, ENABLE);

  /*使能串口接收中断*/
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

}
发送函数如下
void USART2_SendChar(u8 data)
{
        USART_ClearFlag(USART2,USART_FLAG_TC);//看网上有人说发送时限清TC 否则会丢第一个字节
        USART_SendData(USART2,(u8)data);//发送数据
        while( USART_GetFlagStatus(USART2,USART_FLAG_TC)!= SET);//判断是否发送完成
        USART_ClearFlag(USART2,USART_FLAG_TC);//清除标志
}
以上就是发送函数。
接收数据我使用的是中断接收模式
void USART2_IRQHandler(void)
{
    //处理接收到的数据
    if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)//判断是否存在溢出错误
     {
                USART_ClearFlag(USART1,USART_FLAG_ORE);        //清溢出位
                USART_ReceiveData(USART1);               //读DR
                                usart2_idx = 0; //清除计数
     }
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收完成
    {
        //Clear the USART1 Receive interrupt
        usart2_frame_buff[usart2_idx++] = USART_ReceiveData(USART2); //接收数据        


        USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除标志位
                if(usart2_idx == 4){//接收为5个字节则重新接收
                        usart2_idx = 0;
                }        
    }
               
}

问题是我现在在主机上使用发送数据:
u8 USART2_Senddata(void)
{
        u8 i ;
        USART2_SendChar(100);
        for(i = 0;i<0xff;i++);
        USART2_SendChar(101);
        for(i = 0;i<0xff;i++);
        USART2_SendChar(102);
        for(i = 0;i<0xff;i++);
        USART2_SendChar(103);
        for(i = 0;i<0xff;i++);
        USART2_SendChar(104);        
        for(i = 0;i<0xff;i++);
        return 1;
}

但是不能正确接收  下面是我用串口调试助手打印出来的接收信息:

希望坛子里的高手帮忙解答 小弟感激不尽了 。



sds.jpg (138.91 KB )

sds.jpg
沙发
z755924843|  楼主 | 2013-7-29 17:04 | 只看该作者
求解答啊!!!!!讨论一下也行啊。

使用特权

评论回复
板凳
puchuang| | 2013-7-29 18:47 | 只看该作者
不是很了解   楼主   帮你顶一个   看看别人的意见  

使用特权

评论回复
地板
airwill| | 2013-7-29 20:39 | 只看该作者
没有看见说 波特率的设置.
通常波特率不匹配, 会导致接收错误的问题.
另外, 尽量使用标准波特率, 不标准的波特率也会导致实际波特率跟理论值之间有差异.

使用特权

评论回复
5
z755924843|  楼主 | 2013-7-30 08:24 | 只看该作者
airwill 发表于 2013-7-29 20:39
没有看见说 波特率的设置.
通常波特率不匹配, 会导致接收错误的问题.
另外, 尽量使用标准波特率, 不标准的 ...

谢谢你的回复, 我的串口设置如下

void USART2_Configuration(void)
{
        USART_InitTypeDef USART_InitStructure;//①定义结构体
        GPIO_InitTypeDef GPIO_InitStructure;
               
        /* USARTx configured as follow:
        - BaudRate = 4800 baud  
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
         */       

        /*②串口参数配置,结构体赋值*/
        USART_InitStructure.USART_BaudRate = 4800;                                   /*设置波特率为4800*/
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;  /*设置数据位为8
位*/
        USART_InitStructure.USART_StopBits = USART_StopBits_1;           /*设置停止位为1位*/
        USART_InitStructure.USART_Parity = USART_Parity_No;                   /*无奇偶校验*/         
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /*没有硬件流控*/
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;          
/*发送与接收*/
        /*完成串口的时钟配置、GPIO配置,根据上述参数初始化并使能*/
       
/******************************************************************************
****/
       
/******************************************************************************
****/       
        /*③使能时钟RX,TX,USART2*/
        /* Enable GPIO clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        //USART1-GPIO_Pin_9,GPIO_Pin_10
        /* Enable UART clock */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//USART1

        /*④配置USART的GPIO,GPIOA_2 = Tx,GPIOA_3 = Rx*/
        /* Configure USART Tx as alternate function push-pull */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA , &GPIO_InitStructure);
       
        /* Configure USART Rx as input floating */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;
        GPIO_Init(GPIOA , &GPIO_InitStructure);
        /*⑤USART初始化*/
        /* USART configuration */
        USART_Init(USART2, &USART_InitStructure);
        /*⑥USART使能*/               
    /* Enable USART */
        USART_Cmd(USART2, ENABLE);

  /*使能串口接收中断*/
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

}
应该没有错吧,只是我用波特率是4800 我把它改成9600试试看。 谢谢啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:嵌入式相关网站喜欢的朋友了解一下http://www.micropython.group

31

主题

260

帖子

39

粉丝