找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1040|回复: 7
收起左侧

STM32单片机+SIM900A怎么读取信息问题

[复制链接]
回帖奖励 25 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:1072378 发表于 2023-4-18 01:52 | 显示全部楼层 |阅读模式
新消息的返回,比如:+CMTI:“SM”,5之类的,收到的新消息,存放在卡位置5中,那这里是不是要写一个返回位置?然后去读取位置5?这部分在STM32中怎么写呀?求教!!!!!
stm32+SIM900A读取程序要怎么写?
回复

使用道具 举报

ID:883242 发表于 2023-4-18 10:06 | 显示全部楼层
就是个串口处理程序,一点儿思路都没有吗?
回复

使用道具 举报

ID:291668 发表于 2023-4-18 10:42 | 显示全部楼层
看看stm32 的串口例程,就有办法了
回复

使用道具 举报

ID:540903 发表于 2023-4-18 18:02 | 显示全部楼层
以下是使用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信息较长,可能会出现数据丢失的情况。
回复

使用道具 举报

ID:982617 发表于 2023-4-18 21:53 | 显示全部楼层
可以去看一些相关资料,普中或者正点原子的官方论坛上面,找参考例子
回复

使用道具 举报

ID:587810 发表于 2023-4-19 10:59 | 显示全部楼层
就是串口按着SIM900A使用手册上的命令发过去就行了,读取就是监视串口收到的数据,可以使用串口中断程序
回复

使用道具 举报

ID:1072727 发表于 2023-4-19 15:31 | 显示全部楼层
B站正点原子的讲的还是挺清晰的,就看有关串口的问题就好了
回复

使用道具 举报

ID:1072378 发表于 2023-4-20 17:52 | 显示全部楼层
li64331218 发表于 2023-4-18 10:42
看看stm32 的串口例程,就有办法了

好的,谢谢。马上去看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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