OpenEdv-开源电子网

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

STM32H7不能与8266通讯咋整啊

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2021-4-21
在线时间
4 小时
发表于 2021-11-15 11:22:36 | 显示全部楼层 |阅读模式
1金钱
在串口助手里只打印收←◆0. AT,之前测试stm32h7本身串口通讯正常,esp8266与USB_TTL通过发送AT指令,也能连接上wifi,二者连上就果咩了。
/***这是发送数据的函数**/
void USART2_SendData(uint8_t steam)
{
while((USART2->ISR&0X40)==0);
USART2->TDR =steam;
}
void Usart_SendString(UART_HandleTypeDef *USARTx, unsigned char *str, unsigned short len)
{
        unsigned short count = 0;
        for(; count < len; count++)
        {
                USART2_SendData(*str++);                                                                       
        //        HAL_UART_Transmit(&huart2,(unsigned char*)str++,sizeof(str),100);                                                                //发送数据
                while(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC) == RESET);                //等待发送完成
        }

/**发送命令**/
_Bool ESP8266_SendCmd(char *cmd, char *res)
{
        unsigned char timeOut = 200;
        Usart_SendString(&huart2, (unsigned char *)cmd, strlen((const char *)cmd));
        while(timeOut--)
        {
                if(ESP8266_WaitRecive() == REV_OK)                                                        //如果收到数据
                {
                        if(strstr((const char *)esp8266_buf, res) != NULL)                //如果检索到关键词
                        {
                                ESP8266_Clear();                                                                        //清空缓存
                                return 0;
                        }
                }
        HAL_Delay(10);
        }
        return 1;
}

/**发送数据**/
void ESP8266_SendData(unsigned char *data, unsigned short len)
{
        char cmdBuf[32];       
        ESP8266_Clear();                                                                //清空接收缓存
        sprintf(cmdBuf, "AT+CIPSEND=%d\r\n", len);                //发送命令
        if(!ESP8266_SendCmd(cmdBuf, ">"))                                //收到‘>’时可以发送数据
        {
                Usart_SendString(&huart2, data, len);                //发送设备连接请求数据
        }

}

/**8266初始化**/
在这一步中,串口1只能打印0.AT而没有下一步操作,不知道是否是sendcmd的问题
void ESP8266_Init(void)
{
       
        ESP8266_Clear();
       
        printf("0. AT\r\n");
        while(ESP8266_SendCmd("AT\r\n", "OK"))
                HAL_Delay(500);
       
                printf( "1. RST\r\n");
  while(ESP8266_SendCmd("AT+RST\r\n", "OK"))
                HAL_Delay(500);
       
        printf( "2.AT+CIPCLOSE. RST\r\n");
while(ESP8266_SendCmd("AT+CIPCLOSE\r\n", "OK"))
                HAL_Delay(500);
       
        printf("3. CWMODE\r\n");
        while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
                HAL_Delay(500);
       
        printf("4. AT+CWDHCP\r\n");
        while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
                HAL_Delay(500);
       
        printf("5. CWJAP\r\n");
        while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
                HAL_Delay(500);
       
        printf("6. CIPSTART\r\n");
        while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
                HAL_Delay(500);
       
        printf("7. ESP8266 Init OK\r\n");
}

/**串口二中断**/
void USART2_IRQHandler(void)
{
uint8_t Res;
        if(__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) //接收中断
        {
                HAL_UART_Receive(&huart2,&Res,1,1000);
                if(esp8266_cnt >= sizeof(esp8266_buf))        esp8266_cnt = 0; //防止串口被刷爆
                esp8266_buf[esp8266_cnt++] = USART2->RDR;
                 HAL_UART_IRQHandler(&huart2);
__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE);//清标志
        }
}

/**主函数部分关于串口2*/
......
  MX_USART2_UART_Init();
        ESP8266_Init();
                printf(" esp8266 ok \r\n");//插入换行

                 __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);//开启串口2中断

while(1)
{......}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2021-4-21
在线时间
4 小时
 楼主| 发表于 2021-11-15 15:48:43 | 显示全部楼层
对于串口1
/**开启中断**/
void MX_USART1_UART_Init(void)
{
........
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE); //开启接收中断
}
/**串口回调以及中断**/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance==USART1)//如果是串口1
        {
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                        {
                                if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                                else USART_RX_STA|=0x8000;        //接收完成了
                        }
                        else //还没收到0X0D
                        {       
                                if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        Uart1_RxBuff[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
                                }                 
                        }
                }

        }

          HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再次开启接收中断
}

void USART1_IRQHandler(void)
{
    unsigned long timeout=0;
    unsigned long  maxDelay=0x1FFFF;
  HAL_UART_IRQHandler(&huart1);
  timeout=0;
    while (HAL_UART_GetState(&huart1)!=HAL_UART_STATE_READY)//等待就绪
        {
        timeout++;////超时处理
        if(timeout>maxDelay) break;               
        }
     
        timeout=0;
        while(HAL_UART_Receive_IT(&huart1,(uint8_t *)&aRxBuffer,1)!=HAL_OK)//一次处理完成之后,重新开启中断
        {
        timeout++; //超时处理
        if(timeout>maxDelay) break;       
        }
}
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3606
金钱
3606
注册时间
2019-8-14
在线时间
1052 小时
发表于 2021-11-15 16:24:06 | 显示全部楼层
可以参考下这个:基于 H743 H750 潘多拉 板子的8266使用例程:http://www.openedv.com/forum.php?mod=viewthread&tid=316912
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2021-4-21
在线时间
4 小时
 楼主| 发表于 2021-11-15 16:34:49 | 显示全部楼层
hou18 发表于 2021-11-15 16:24
可以参考下这个:基于 H743 H750 潘多拉 板子的8266使用例程:http://www.openedv.com/forum.php?mod=viewt ...

好的,谢谢。他这个好多都是寄存器的操作啊
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2021-4-21
在线时间
4 小时
 楼主| 发表于 2021-11-22 16:07:11 | 显示全部楼层
现在修改了下串口的中断
void MX_USART2_UART_Init(void)
{
...
        __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);//开启串口2中断
}
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
......
    HAL_NVIC_SetPriority(USART2_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(USART2_IRQn);
        __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);//开启串口2中断
    USART2->CR1 |= ((uint16_t)0x2000);//USART使能
}
在串口助手上可以收到0at 1at+rst 2AT+CIPCLOSE.
void USART2_IRQHandler(void)(中断服务函数)
{
uint8_t Res;
        if(__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) //接收中断
        {
                HAL_UART_Receive(&huart2,&Res,1,1000);
                if(esp8266_cnt >= sizeof(USART_RX_BUF_2))        esp8266_cnt = 0; //防止串口被刷爆
                USART_RX_BUF_2[esp8266_cnt++] = USART2->RDR;
                 HAL_UART_IRQHandler(&huart2);
__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE);//清标志
        }
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 15:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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