


这三部分hal库代码如何转成标准库代码呀?求解,需要实现向手机发送英文短信
关注让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。
如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!
根据您提供的HAL库代码,我将为您转换为STM32标准库代码,实现通过AIR780E模块发送英文短信的功能。
原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);
}
}
原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();
}
原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;
}
#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);
}
Delay函数需要您自己实现,可以使用SysTick定时器希望这些代码能帮助您实现通过AIR780E模块发送英文短信的功能。如果有任何问题,请随时提问。