NIKK¹¹ 2025-05-15 00:24 采纳率: 100%
浏览 29
已结题

air780e stm32标准库发送英文短信

img

img

img


这三部分hal库代码如何转成标准库代码呀?求解,需要实现向手机发送英文短信

  • 写回答

4条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-05-15 00:41
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。
    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    将HAL库代码转换为STM32标准库代码

    根据您提供的HAL库代码,我将为您转换为STM32标准库代码,实现通过AIR780E模块发送英文短信的功能。

    1. 串口接收中断回调函数转换

    原HAL库代码:

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
        if (huart == &huart2) {
            if (point2 < USART2_MAX_RECV_LEN) {
                USART2_RX_BUF[point2++] = c;
                HAL_UART_Receive_IT(huart, (uint8_t *)&c, 1);
            }
        }
    }
    

    标准库代码:

    void USART2_IRQHandler(void) {
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {
            if(point2 < USART2_MAX_RECV_LEN) {
                USART2_RX_BUF[point2++] = USART_ReceiveData(USART2);
            }
            USART_ClearITPendingBit(USART2, USART_IT_RXNE);
        }
    }
    

    2. 系统时钟配置转换

    原HAL库代码:

    void SystemClock_Config(void) {
        RCC_OscInitTypeDef RCC_OscInitStruct = {0};
        RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
        
        RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
        RCC_OscInitStruct.HSEState = RCC_HSE_ON;
        RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
        RCC_OscInitStruct.HSIState = RCC_HSI_ON;
        RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
        RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
        RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MULZ;
        
        if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
            Error_Handler();
        }
        
        RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                    |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
        RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
        RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
        RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
        RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
        
        if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
            Error_Handler();
        }
    }
    

    标准库代码:

    void SystemClock_Config(void) {
        RCC_DeInit();
        
        RCC_HSEConfig(RCC_HSE_ON);
        while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
        
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_Z);
        RCC_PLLCmd(ENABLE);
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        RCC_HCLKConfig(RCC_SYSCLK_Div1);
        RCC_PCLK1Config(RCC_HCLK_Div1);
        RCC_PCLK2Config(RCC_HCLK_Div1);
        
        SystemCoreClockUpdate();
    }
    

    3. 发送AT命令函数转换

    原HAL库代码:

    signed int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry) {
        unsigned char n;
        USART2_CLR_Buf();
        
        for(n = 0; n < Retry; n++) {
            HAL_UART_Transmit(&huart2, (uint8_t *)Command, strlen(Command), 0xFFFF);
            Time_Cont = 0;
            
            while(Time_Cont < Timeout) {
                HAL_Delay(100);
                Time_Cont += 100;
                if(strstr((const char *)USART2_RX_BUF, (const char *)Response) != NULL) {
                    USART2_CLR_Buf();
                    return Success;
                }
            }
            Time_Cont = 0;
            USART2_CLR_Buf();
        }
        return Failure;
    }
    

    标准库代码:

    signed int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry) {
        unsigned char n;
        USART2_CLR_Buf();
        
        for(n = 0; n < Retry; n++) {
            USART_SendData(USART2, (uint8_t *)Command, strlen(Command));
            Time_Cont = 0;
            
            while(Time_Cont < Timeout) {
                Delay(100); // 需要实现自己的Delay函数
                Time_Cont += 100;
                if(strstr((const char *)USART2_RX_BUF, (const char *)Response) != NULL) {
                    USART2_CLR_Buf();
                    return Success;
                }
            }
            Time_Cont = 0;
            USART2_CLR_Buf();
        }
        return Failure;
    }
    

    4. 完整的发送英文短信实现

    #include "stm32f10x.h"
    #include <string.h>
    
    #define USART2_MAX_RECV_LEN 256
    #define Success 0
    #define Failure -1
    
    uint8_t USART2_RX_BUF[USART2_MAX_RECV_LEN];
    uint16_t point2 = 0;
    uint32_t Time_Cont = 0;
    
    void USART2_CLR_Buf(void) {
        memset(USART2_RX_BUF, 0, USART2_MAX_RECV_LEN);
        point2 = 0;
    }
    
    void USART2_Init(uint32_t baudrate) {
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
        
        // USART2_TX -> PA2
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        // USART2_RX -> PA3
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        USART_InitStructure.USART_BaudRate = baudrate;
        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(USART2, &USART_InitStructure);
        
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
        
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        USART_Cmd(USART2, ENABLE);
    }
    
    int sendSMS(char *phoneNumber, char *message) {
        char cmd[64];
        
        // 设置短信文本模式
        if(sendCommand("AT+CMGF=1\r\n", "OK", 2000, 3) != Success) {
            return Failure;
        }
        
        // 设置接收方号码
        sprintf(cmd, "AT+CMGS=\"%s\"\r\n", phoneNumber);
        if(sendCommand(cmd, ">", 2000, 3) != Success) {
            return Failure;
        }
        
        // 发送短信内容
        sprintf(cmd, "%s%c", message, 0x1A); // 0x1A是Ctrl+Z,表示短信结束
        if(sendCommand(cmd, "OK", 5000, 3) != Success) {
            return Failure;
        }
        
        return Success;
    }
    
    int main(void) {
        SystemClock_Config();
        USART2_Init(115200);
        
        while(1) {
            if(sendSMS("13800138000", "Hello from STM32!") == Success) {
                // 短信发送成功
                break;
            }
            Delay(5000); // 5秒后重试
        }
        
        while(1);
    }
    

    注意事项

    1. 需要根据您的具体硬件连接修改GPIO引脚配置
    2. Delay函数需要您自己实现,可以使用SysTick定时器
    3. 确保AIR780E模块的波特率与代码中设置的波特率一致
    4. 短信发送可能需要一定时间,请适当调整超时参数
    5. 在实际应用中,建议添加更多的错误处理和重试机制

    希望这些代码能帮助您实现通过AIR780E模块发送英文短信的功能。如果有任何问题,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月23日
  • 已采纳回答 5月15日
  • 创建了问题 5月15日