找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7555|回复: 6
打印 上一主题 下一主题
收起左侧

关于STM32使用UART4问题,请高手指点

[复制链接]
跳转到指定楼层
楼主
ID:240266 发表于 2018-3-21 13:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近小弟学习STM32编程,购买了一个模块(WiFi-ESP8266),将引脚接入UART4来驱动,进行收发数据,后面发现,发出去的数据和接收的数据一模一样,感觉不对劲,因为按照模块说明收到数据后,返回值和发送的是有区别的,但是找了好多资料没有找到问题,请各位有经验的大哥指教;如下是代码:(使用的是STM32F103VET6芯片)

这个是UART4的初始化:
void UART4_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
          USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;        //PB10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);  

        RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4,ENABLE);
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4,DISABLE);

       
        USART_InitStructure.USART_BaudRate = 115200;
        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(UART4, &USART_InitStructure); ;

        NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

    USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
        //USART_ITConfig(UART4, USART_IT_TC, ENABLE);
    USART_Cmd(UART4, ENABLE);                    
        USART_ClearFlag(UART4, USART_FLAG_TC);
}


这个是发送函数
void WiFi_SendData(u8 *str,unsigned int count)
{
                if(count>0)
                {
                        Sendstr1 = str;
                        Send_Count1 = count;
                        //GPIO_SetBits(RS485_RTS_PORT, RS485_RTS);
                        USART_ITConfig(UART4, USART_IT_TXE, ENABLE);
                }
}


中断函数:
void UART4_IRQHandler(void)                        //中断函数
{
unsigned char data=0;
        unsigned char sbuf_temp = 0;
                /******************/
                if(uart.recetime == 0)
                {
                        uart.len = 0;
                        uart.errorbit = 0 ;
                        RS485_Read_Count=0;
                        RS485_Read_OK=0;
                }
                uart.recetime = 100;//这个是作为是否接收完成的标示,在别的地方用一个定时器控制
                /*******************/
    if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)  //判断是否有接收到数据
    {
                        data = USART_ReceiveData(UART4);         



                                sbuf_temp = data;
                                uart.revice_buffer[uart.len] = sbuf_temp
                                uart.len++;
                        RS485_Receive_Time = 0;
                        if(uart.len > 80 -2)
                        {
                                uart.errorbit = 1 ;
                                uart.len = 76 ;//·¢ÏÖ′íÎó
                        }
    }

    if(USART_GetITStatus(UART4, USART_IT_TXE) != RESET)  //发送数据
    {
                        if(Send_Count1)
                        {

                                USART_SendData(UART4,*Sendstr1++);
                                Send_Count1--;
                        }
                        else
                        {
                                USART_ITConfig(UART4, USART_IT_TXE, DISABLE);//发送完毕,停止发送
                                USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//转变成,等等接收
                                RS485_Send_Time=1;//接收完成标示
                        }       
    }
                if(USART_GetFlagStatus(UART4,USART_FLAG_ORE)==SET)
                {
                        USART_ClearFlag(UART4,USART_FLAG_ORE);
                        USART_ReceiveData(UART4);
                }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:240266 发表于 2018-3-21 13:38 | 只看该作者
我后面测试了,好像,发送也没有发成功
回复

使用道具 举报

板凳
ID:240266 发表于 2018-3-25 13:41 | 只看该作者
已经解决了,搞了好多天。
回复

使用道具 举报

地板
ID:417406 发表于 2018-10-29 17:24 | 只看该作者
遇到同样的问题。。求助。。怎么解决的?
回复

使用道具 举报

5#
ID:417408 发表于 2018-10-29 17:33 | 只看该作者
你是电路板的RXD和TXD连到一起了吧。
回复

使用道具 举报

6#
ID:731733 发表于 2020-7-10 15:57 | 只看该作者
hongjiang2017 发表于 2018-3-21 13:38
我后面测试了,好像,发送也没有发成功

怎么解决的啊 兄弟
回复

使用道具 举报

7#
ID:731733 发表于 2020-7-10 16:02 | 只看该作者
怎么解决的呢 楼主
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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