打印
[STM32F1]

USART3问题

[复制链接]
1075|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LYMingBoy|  楼主 | 2017-11-13 11:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#include "USART.h"

u8 USART3_RX_BUF[14]; //接收缓冲u8 CH4ZeroSetFlag=0;
u16 USART3_RX_STA=0;       //接收状态标记

/********************************************************************
    改硬件后,将串口1--USART1改为串口--3USART3
********************************************************************/

void USART3_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
       
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);  //USART1挂在RCC_APB2Periph
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    //数据输出端   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);           
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;     //数据输入端  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = SEND_485;       //控制MAX487芯片   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);  

        USART_InitStructure.USART_BaudRate = 9600;                                       //波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;                      //数据位
        USART_InitStructure.USART_StopBits = USART_StopBits_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;
        USART_Init(USART3, &USART_InitStructure);
       
        USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
//  USART_ITConfig(USART3, USART_IT_TC, ENABLE);    //打开发送完成中断
       
        USART_Cmd(USART3,ENABLE);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);                                  //配置串口中断
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;         
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;                        //抢占优先级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                               //响应优先级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
//        USART_ClearFlag(USART2, USART_FLAG_TC);//清发送完成标志位
        GPIOA->BRR = SEND_485;    //默认为接收
}


void USART3_IRQHandler(void)                        //串口3中断服务程序
{               
        u8 Res;
        OSIntEnter();  
        if(USART_GetITStatus(USART3, USART_IT_RXNE)!= RESET)  //接收中断
        {
          USART_ClearITPendingBit(USART3,USART_IT_RXNE);  //清除中断标志
                Res =USART_ReceiveData(USART3);                   //读取接收到的数据
                USART3_RX_BUF[USART3_RX_STA]=Res;
                        if(USART3_RX_STA>14)
                        {
                                USART3_RX_STA=0;
                        }
                        else
                        {       
                                USART3_RX_STA++;
                        }
        }
   OSIntExit();          
   OSIntEnter();
         
         if(USART_GetITStatus(USART3, USART_IT_TC) != RESET)
         {
            USART_ITConfig(USART3, USART_IT_TC, DISABLE);    //关闭发送完成中断
            USART_ClearITPendingBit(USART3,  USART_IT_TC);  //清除中断标志                       
   }                 
        OSIntExit();        
}

void USART3_SendByte(uint8_t byte)
{
   SEND_485_TX;           //控制RS485收发芯片MAX487:发送模式
         OSTimeDlyHMSM(0,0,0,2);
   USART_SendData(USART3,byte);
   while (USART_GetFlagStatus(USART3,USART_FLAG_TC) !=SET);
         OSTimeDlyHMSM(0,0,0,2);
   SEND_485_RX;      //接收模式
}



int fputc(int ch, FILE *f)
{
        /* 将Printf内容发往串口 */
//         USART3->SR;
        USART_SendData(USART3, (unsigned char) ch);
        while (!(USART3->SR & USART_FLAG_TXE));
       
        return (ch);
}


现在的问题是,可以正确发送数据到串口助手,但是从串口助手发送过来的数据,可以进入接收中断,但是读取不了数据。
求各位大神指导。。。

沙发
airwill| | 2017-11-13 12:44 | 只看该作者
什么叫 "读取不了数据"?   读出来错误吗?   怎么的错误呢

使用特权

评论回复
板凳
一路向北lm| | 2017-11-13 12:47 | 只看该作者
串口调试可以吗?发个图片看下?

使用特权

评论回复
地板
mmuuss586| | 2017-11-13 13:29 | 只看该作者
能进入串口中断:读数据肯定没问题啊,你读接收数据地址就可以了;是读到的数据不对?

使用特权

评论回复
5
LYMingBoy|  楼主 | 2017-11-13 16:01 | 只看该作者
airwill 发表于 2017-11-13 12:44
什么叫 "读取不了数据"?   读出来错误吗?   怎么的错误呢

就像这样发一帧数据,有时候读不到,有时候读取到,但是是错误的

9T94%2GQOM_97{K}GBH)HD3.png (115.32 KB )

9T94%2GQOM_97{K}GBH)HD3.png

使用特权

评论回复
6
LYMingBoy|  楼主 | 2017-11-13 16:02 | 只看该作者
mmuuss586 发表于 2017-11-13 13:29
能进入串口中断:读数据肯定没问题啊,你读接收数据地址就可以了;是读到的数据不对? ...

有时候读不到,有时候读到但是错误的

使用特权

评论回复
7
LYMingBoy|  楼主 | 2017-11-13 16:04 | 只看该作者
一路向北lm 发表于 2017-11-13 12:47
串口调试可以吗?发个图片看下?

从串口助手发送14个数据,然后读取数据再发回串口助手,有时候读不到,有时候读到,但是是错误的

9T94%2GQOM_97{K}GBH)HD3.png (115.32 KB )

9T94%2GQOM_97{K}GBH)HD3.png

使用特权

评论回复
8
LYMingBoy|  楼主 | 2017-11-13 16:05 | 只看该作者
mmuuss586 发表于 2017-11-13 13:29
能进入串口中断:读数据肯定没问题啊,你读接收数据地址就可以了;是读到的数据不对? ...

是啊,读到的数据不对,也不完全

使用特权

评论回复
9
mmuuss586| | 2017-11-13 16:16 | 只看该作者
跑裸机测试下看看;

使用特权

评论回复
10
LYMingBoy|  楼主 | 2017-11-13 16:17 | 只看该作者
mmuuss586 发表于 2017-11-13 16:16
跑裸机测试下看看;

跑裸机情况也是一样

使用特权

评论回复
11
xixi2017| | 2017-11-13 18:42 | 只看该作者
好奇怪,都能收发了,内容却不同。

使用特权

评论回复
12
airwill| | 2017-11-13 20:00 | 只看该作者
也可能是硬件的问题, 比如 RXD 线上有比较大的电容, 也可能是你 USB 串口线问题, 换个试试

使用特权

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

本版积分规则

1

主题

6

帖子

0

粉丝