找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1667|回復(fù): 7
收起左側(cè)

STM32單片機(jī)+SIM900A怎么讀取信息問題

[復(fù)制鏈接]
回帖獎勵 25 黑幣 回復(fù)本帖可獲得 5 黑幣獎勵! 每人限 1 次
ID:1072378 發(fā)表于 2023-4-18 01:52 | 顯示全部樓層 |閱讀模式
新消息的返回,比如:+CMTI:“SM”,5之類的,收到的新消息,存放在卡位置5中,那這里是不是要寫一個返回位置?然后去讀取位置5?這部分在STM32中怎么寫呀?求教。。。。
stm32+SIM900A讀取程序要怎么寫?
回復(fù)

使用道具 舉報

ID:883242 發(fā)表于 2023-4-18 10:06 | 顯示全部樓層
就是個串口處理程序,一點兒思路都沒有嗎?
回復(fù)

使用道具 舉報

ID:291668 發(fā)表于 2023-4-18 10:42 | 顯示全部樓層
看看stm32 的串口例程,就有辦法了
回復(fù)

使用道具 舉報

ID:540903 發(fā)表于 2023-4-18 18:02 | 顯示全部樓層
以下是使用STM32F409單片機(jī)通過SIM900A模塊讀取的代碼示例,僅供參考:  #define USART2_RX_BUF_SIZE 256   // 定義串口接收緩沖區(qū)大小 #define SMS_BUF_SIZE 256         // 定義緩沖區(qū)大小  uint8_t usart2_rx_buf[USART2_RX_BUF_SIZE];  // 串口接收緩沖區(qū) uint8_t sms_buf[SMS_BUF_SIZE];              // 緩沖區(qū)  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);      // 發(fā)送AT指令到SIM900A     USART_SendString(USART2, "AT+CMGF=1\r\n");    // 設(shè)置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);      // 讀取內(nèi)容     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);// 將讀取到的發(fā)送出去      while (1); }  以上代碼僅供參考,可以根據(jù)自己的需求進(jìn)行相應(yīng)的修改和仿照。需要注意的是,以上代碼中使用了一個簡單的延時函數(shù)delay_ms()。在實際開發(fā)中,推薦使用STM32F409單片機(jī)中的定時器等高精度等待函數(shù)代替。另外,由于USART端口的通信速率是9600bps,如果SMS信息較長,可能會出現(xiàn)數(shù)據(jù)丟失的情況。
回復(fù)

使用道具 舉報

ID:982617 發(fā)表于 2023-4-18 21:53 | 顯示全部樓層
可以去看一些相關(guān)資料,普中或者正點原子的官方論壇上面,找參考例子
回復(fù)

使用道具 舉報

ID:587810 發(fā)表于 2023-4-19 10:59 | 顯示全部樓層
就是串口按著SIM900A使用手冊上的命令發(fā)過去就行了,讀取就是監(jiān)視串口收到的數(shù)據(jù),可以使用串口中斷程序
回復(fù)

使用道具 舉報

ID:1072727 發(fā)表于 2023-4-19 15:31 | 顯示全部樓層
B站正點原子的講的還是挺清晰的,就看有關(guān)串口的問題就好了
回復(fù)

使用道具 舉報

ID:1072378 發(fā)表于 2023-4-20 17:52 | 顯示全部樓層
li64331218 發(fā)表于 2023-4-18 10:42
看看stm32 的串口例程,就有辦法了

好的,謝謝。馬上去看
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表