以下是使用STM32F409单片机通过SIM900A模块读取的代码示例,仅供参考: #define USART2_RX_BUF_SIZE 256 // 定义串口接收缓冲区大小 #define SMS_BUF_SIZE 256 // 定义缓冲区大小 uint8_t usart2_rx_buf[USART2_RX_BUF_SIZE]; // 串口接收缓冲区 uint8_t sms_buf[SMS_BUF_SIZE]; // 缓冲区 void SIM900A_Init(void) { // 初始化USART2串口 USART_InitTypeDef USART_InitStruct; USART_StructInit(&USART_InitStruct); USART_InitStruct.USART_BaudRate = 9600; // 波特率为9600 USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStruct); USART_Cmd(USART2, ENABLE); // 等待SIM900A模块正常工作 delay_ms(10000); // 发送AT指令到SIM900A USART_SendString(USART2, "AT+CMGF=1\r\n"); // 设置SIM900A为文本模式 delay_ms(1000); } int8_t SIM900A_ReadSMS(uint8_t index) { // 读取SIM900A收到的 USART_SendString(USART2, "AT+CMGR="); USART_SendByte(USART2, index); USART_SendString(USART2, "\r\n"); delay_ms(1000); // 读取内容 uint8_t i = 0; while (usart2_rx_buf) { if (strstr((char *)&usart2_rx_buf, "+CMGR") != NULL) { i += strstr((char *)&usart2_rx_buf, "+CMGR") - (char *)&usart2_rx_buf; i += strstr((char *)&usart2_rx_buf, ",") - (char *)&usart2_rx_buf + 1; i += strstr((char *)&usart2_rx_buf, ",") - (char *)&usart2_rx_buf + 1; i += strstr((char *)&usart2_rx_buf, ",") - (char *)&usart2_rx_buf + 1; i += strstr((char *)&usart2_rx_buf, ",") - (char *)&usart2_rx_buf + 1; while (usart2_rx_buf != '\r') i++; i += 2; // 跳过\r\n uint8_t j = 0; while (usart2_rx_buf != '\r' && j < SMS_BUF_SIZE) { sms_buf[j++] = usart2_rx_buf[i++]; } sms_buf[j] = '\0'; return 0; // 读取成功 } i++; if (i >= USART2_RX_BUF_SIZE) break; } return -1; // 读取失败 } int main(void) { SIM900A_Init(); // 初始化SIM900A SIM900A_ReadSMS(1); // 读取SIM900A中索引为1的 USART_SendString(USART2, sms_buf);// 将读取到的发送出去 while (1); } 以上代码仅供参考,可以根据自己的需求进行相应的修改和仿照。需要注意的是,以上代码中使用了一个简单的延时函数delay_ms()。在实际开发中,推荐使用STM32F409单片机中的定时器等高精度等待函数代替。另外,由于USART端口的通信速率是9600bps,如果SMS信息较长,可能会出现数据丢失的情况。
|