M26模組的應用例子,包括接聽語音呼叫、模塊撥號測試、GSM錄音、使用 TEXT 模式發送短信、使用 PDU 模式發送短信、藍牙傳輸測試
、TCP連接測試、UDP透傳測試、模塊基站定位
EasyM26每一個功能實驗對應一個函數實現,
當要驗證某一功能時, 只需要將主函數 while
循環下該函數前注釋刪掉.
單片機源程序如下:
- /**
- * @file main.c
- * @author dibo
- * @version 1.0
- * @data 2018-3-18
- * @brief
- * COPYRIGHT(c) 2018 ZERO CHIP
- */
- #include "main.h"
- #include "stm32f1xx_hal.h"
- #include "clk.h"
- #include "led.h"
- #include "uart2.h"
- #include "m26.h"
- int main(void)
- {
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* Configure the system clock */
- SystemClock_Config();
- /* Initialize all configured peripherals */
- led_init();
- MX_USART2_UART_Init();
- open_uart2_rx();
-
- while (1)
- {
- // m26_ring_test(); /* 實驗1 GSM接電話 */
- // m26_call_test(); /* 實驗2 GSM打電話 */
- // m26_gsm_record(); /* 實驗3 GSM錄音 */
- // m26_sms_text(); /* 實驗4 發短信(TEXT模式) */
- // m26_sms_pdu(); /* 實驗5 發短信(PDU模式) */
- // m26_bt_master(); /* 實驗6 藍牙主機模式 */
- // m26_bt_slave(); /* 實驗7 藍牙從機模式 */
- // m26_tcp_test(); /* 實驗8 TCP透傳 */
- // m26_udp_test(); /* 實驗9 UDP透傳 */
- // m26_locator_test(); /* 實驗10 LBS基站定位 */
- }
- }
- void Error_Handler(void)
- {
- }
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
復制代碼- /**
- * @file m26.c
- * @author dibo
- * @version 1.0
- * @data 2018-3-18
- * @brief
- * COPYRIGHT(c) 2018 ZERO CHIP
- */
- #include "m26.h"
- #include "uart2.h"
- #include <string.h>
- uint8_t M26_State = 0;
- /*-------------------------------------------------------------------*/
- /* 內部函數原型 -----------------------------------------------------*/
- void m26_poweron(void);
- uint8_t m26_send_cmd(char *cmd, char *ack, uint16_t waittime);
- char* m26_check_cmd(char *str);
- /*-------------------------------------------------------------------*/
- /*-------------------------------------------------------------------*/
- /**
- * @brief M26 模塊撥號測試
- */
- void m26_call_test(void)
- {
- switch(M26_State)
- {
- case 0:
- m26_poweron();
- M26_State++;
- break;
- case 1:
- /* 啟用命令回顯 */
- m26_send_cmd("ATE1\r\n", "OK", 200);
- /* 確保模塊工作正常 */
- m26_send_cmd("AT+CPIN?\r\n", "OK", 200); /* 查詢SIM卡狀態 */
- m26_send_cmd("AT+CSQ\r\n", "OK", 200); /* 信號質量 */
- m26_send_cmd("AT+CREG?\r\n", "OK", 200); /* 網絡注冊信息 */
- m26_send_cmd("AT+CGREG?\r\n", "OK", 200); /* GPRS網絡注冊狀態 */
- /* 顯示被叫識別 */
- m26_send_cmd("AT+COLP=1\r\n", "OK", 200);
- /* 切換音頻通道為耳機通道 */
- m26_send_cmd("AT+QAUDCH=1\r\n", "OK", 200);
-
- /* 建立語音呼叫, 撥打 10086 */
- m26_send_cmd("ATD10086;\r\n", "OK", 200);
-
- M26_State++;
- break;
- case 2:
- HAL_Delay(10000);
- M26_State++;
- break;
- case 3:
- m26_send_cmd("ATH\r\n", "OK", 200);
- M26_State++;
- break;
- default:
- break;
- }
- }
- /**
- * @brief 接聽語音呼叫
- */
- void m26_ring_test(void)
- {
- switch(M26_State)
- {
- case 0:
- m26_poweron();
- M26_State++;
- break;
- case 1:
- /* 切換音頻通道為耳機通道 */
- m26_send_cmd("AT+QAUDCH=1\r\n", "OK", 200);
-
- USART2RxSta = 0;
-
- M26_State++;
- break;
- case 2:
- /* 接收到一次數據 */
- if (USART2RxSta & 0x8000)
- {
- /* 添加結束符 */
- USART2RxBuf[USART2RxSta & 0x7FFF] = 0;
-
- if ( strstr((const char*)USART2RxBuf, (const char*)"RING") )
- {
- M26_State++;
- }
-
- USART2RxSta = 0;
- }
-
- break;
- case 3:
- /* 接聽語音呼叫 */
- m26_send_cmd("ATA\r\n", "OK", 200);
-
- M26_State++;
- break;
- default:
- break;
- }
- }
- /**
- * @brief M26 GSM錄音
- */
- void m26_gsm_record(void)
- {
- switch(M26_State)
- {
- case 0:
- m26_poweron();
- M26_State++;
- break;
- case 1:
- /* 啟用命令回顯 */
- m26_send_cmd("ATE1\r\n", "OK", 200);
- /* 切換音頻通道為耳機通道 */
- m26_send_cmd("AT+QAUDCH=1\r\n", "OK", 200);
- /* 建立語音呼叫, 撥打 10086 */
- m26_send_cmd("ATD10086;\r\n", "OK", 200);
-
- /* 開始錄音 */
- m26_send_cmd("AT+QAUDCH=1,\"test.amr\"\r\n", "OK", 200);
-
- M26_State++;
- break;
- case 2:
- HAL_Delay(10000);
- M26_State++;
- break;
- case 3:
- /* 停止錄音 */
- m26_send_cmd("AT+QAUDRD=0\r\n", "OK", 200);
- M26_State++;
- break;
- case 4:
- /* 播放錄音 */
- m26_send_cmd("AT+QAUDPLAY=\"test.amr\",0,60\r\n", "OK", 200);
-
- HAL_Delay(10000);
-
- /* 停止錄音 */
- m26_send_cmd("AT+QAUDSTOP\r\n", "OK", 200);
- M26_State++;
- default:
- break;
- }
- }
- /**
- * @brief 使用 TEXT 模式發送短信
- */
- void m26_sms_text(void)
- {
- switch(M26_State)
- {
- case 0:
- m26_poweron();
- M26_State++;
- break;
- case 1:
- m26_send_cmd("AT+CMGF=1\r\n", "OK", 200);
- m26_send_cmd("AT+CSCS=\"GSM\"\r\n", "OK", 200);
- m26_send_cmd("AT+CMGS=\"10086\"\r\n", ">", 200);
- m26_send_cmd("1\r\n", "OK", 200);
-
- M26_State++;
- break;
- case 2:
- break;
- default:
- break;
- }
- }
- /**
- * @brief 使用 PDU 模式發送短信
- */
- void m26_sms_pdu(void)
- {
- switch(M26_State)
- {
- case 0:
- m26_poweron();
- M26_State++;
- break;
- case 1:
- m26_send_cmd("AT+CSCS=\"GSM\"\r\n", "OK", 200);
- m26_send_cmd("AT+CMGF=0\r\n", "OK", 200);
- m26_send_cmd("AT+CSCS=\"UCS2\"\r\n", "OK", 200);
- m26_send_cmd("AT+CMGS=39\r\n", ">", 200);
- m26_send_cmd("0891683108501705F011000D91688152613201F800080018\
- 670968A660F376844EBAFF0C547D90FD662F82E67684FF01\r\n", "OK", 200);
-
- M26_State++;
- break;
- case 2:
- break;
- default:
- break;
- }
- }
- /**
- * @brief M26 藍牙主機模式
- */
- void m26_bt_master(void)
- {
- switch(M26_State)
- {
- case 0:
- m26_poweron();
- M26_State++;
- break;
- case 1:
- m26_send_cmd("AT+QBTPWR=1\r\n", "OK", 200); /* 打開藍牙模塊 */
- m26_send_cmd("AT+QBTUNPAIR=1\r\n", "OK", 200); /* 刪除已配對藍牙設備 */
- m26_send_cmd("AT+QBTSCAN\r\n", "OK", 1000); /* 掃描藍牙設備, 等待10s */
-
- M26_State++;
- break;
- case 2:
- if (USART2RxSta & 0x8000)
- {
- /* 添加結束符 */
- USART2RxBuf[USART2RxSta & 0x7FFF] = 0;
- if (strstr((char*)USART2RxBuf, (char*)"+QBTSCAN:0"))
- {
- M26_State++;
- }
-
- USART2RxSta = 0;
- }
- break;
- case 3:
- /* 配對, 藍牙設備列表第一個掃描到設備, 等待10s */
- m26_send_cmd("AT+QBTPAIR=1\r\n", "+QBTPAIR", 1000);
- /* 接受配對 */
- m26_send_cmd("AT+QBTPAIRCNF=1\r\n", "+QBTPAIRCNF", 200);
-
- USART2RxSta = 0; /* 清接收狀態 */
-
- M26_State++;
- break;
- case 4:
- if (USART2RxSta & 0x8000)
- {
- /* 添加結束符 */
- USART2RxBuf[USART2RxSta & 0x7FFF] = 0;
- if (strstr((char*)USART2RxBuf, (char*)"+QBTPAIRCNF: 1,1,1"))
- {
- M26_State++;
- }
-
- USART2RxSta = 0;
- }
- break;
- case 5:
- /* 初始化連接, 以透傳方式 */
- m26_send_cmd("AT+QBTCONN=1,0,2\r\n", "+QBTCONN", 200);
- M26_State++;
- case 6:
- /* 發送數據到從機(這里以手機為例) */
- m26_send_cmd("EasyM26, BT 主機模式測試.\r\n", "+QBTCONN", 200);
- HAL_Delay(10000);
- break;
- default:
- break;
- }
- }
- /**
- * @brief M26 藍牙從機模式
- */
- void m26_bt_slave(void)
- {
- switch(M26_State)
- {
- case 0:
- m26_poweron();
- M26_State++;
- break;
- case 1:
- m26_send_cmd("AT+QBTPWR=1\r\n", "OK", 200); /* 打開藍牙模塊 */
- m26_send_cmd("AT+QBTVISB=1\r\n", "OK", 200); /* 設置 M26 藍牙可見 */
- m26_send_cmd("AT+QBTNAME=\"M26\"\r\n", "OK", 200); /* 藍牙名稱 */
-
- /* 清接收狀態, 準備接收配對 */
- USART2RxSta = 0;
-
- M26_State++;
- break;
- case 2:
- if (USART2RxSta & 0x8000)
- {
- /* 添加結束符 */
- USART2RxBuf[USART2RxSta & 0x7FFF] = 0;
-
- if (strstr((char*)USART2RxBuf, (char*)"+QBTIND: \"pair\""))
- {
- /* 接受配對 */
- m26_send_cmd("AT+QBTPAIRCNF=1\r\n", "OK", 200);
- }
- else if (strstr((char*)USART2RxBuf, (char*)"+QBTIND: \"conn\""))
- {
- /* 接受連接 */
- m26_send_cmd("AT+QBTACPT=1,2\r\n", "OK", 200);
-
- M26_State++;
- }
-
- USART2RxSta = 0;
- }
- break;
- case 3:
-
- break;
- default:
- break;
- }
- }
- /**
- * @brief M26 TCP連接測試
- */
- void m26_tcp_test(void)
- {
- switch(M26_State)
- {
- case 0:
- m26_poweron();
- M26_State++;
- break;
- case 1:
- m26_send_cmd("ATE0\r\n", "OK", 200); /* 關閉回顯 */
- /* 確保模塊工作正常 */
- m26_send_cmd("AT+CPIN?\r\n", "OK", 200); /* 查詢SIM卡狀態 */
- m26_send_cmd("AT+CSQ\r\n", "OK", 200); /* 信號質量 */
- m26_send_cmd("AT+CREG?\r\n", "OK", 200); /* 網絡注冊信息 */
- m26_send_cmd("AT+CGREG?\r\n", "OK", 200); /* GPRS網絡注冊狀態 */
- /* TCP設置 */
- m26_send_cmd("AT+QIMODE=0\r\n", "OK", 200); /* 配置TCPIP應用模式為非透傳模式 */
- m26_send_cmd("AT+QICSGP=1,\"FXTX.ZB.SD\"\r\n", "OK", 200); /* 設置接入點,聯通移動默認CMNET. 由于測試使用的是專網卡,所以這里設置了專用接入點 */
- m26_send_cmd("AT+QIREGAPP\r\n", "OK", 200);
- m26_send_cmd("AT+QICSGP?\r\n", "OK", 200);
- m26_send_cmd("AT+QIACT\r\n", "OK", 200);
- m26_send_cmd("AT+QILOCIP\r\n", "QILOCIP", 200); /* 獲取IP */
- /* 連接服務器 */
- m26_send_cmd("ATV1\r\n", "OK", 200);
- m26_send_cmd("AT+QIHEAD=1\r\n", "OK", 200);
- m26_send_cmd("AT+QIDNSIP=1\r\n", "OK", 200);
- m26_send_cmd("AT+QIOPEN=\"TCP\",\"zerochip.in.3322.org\",\"7425\"\r\n", "OK", 200);
- /* 發送數據到遠端服務器 */
- m26_send_cmd("AT+QISEND=18\r\n", ">", 200);
- m26_send_cmd("zerochip easy m26.", "SEND OK", 200);
- /* 關閉連接 */
- m26_send_cmd("AT+QICLOSE\r\n", "CLOSE OK", 200);
-
- HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
-
- M26_State++;
- break;
- case 2:
- HAL_Delay(10000);
- M26_State++;
- break;
- case 3:
-
- // M26_State++;
- break;
- default:
- break;
- }
- }
- /**
- * @brief M26 UDP透傳測試
- */
- void m26_udp_test(void)
- {
- switch(M26_State)
- {
- case 0:
- m26_poweron();
- M26_State++;
- break;
- case 1:
- m26_send_cmd("ATE0\r\n", "OK", 200); /* 關閉回顯 */
- /* 確保模塊工作正常 */
- m26_send_cmd("AT+CPIN?\r\n", "OK", 200); /* 查詢SIM卡狀態 */
- m26_send_cmd("AT+CSQ\r\n", "OK", 200); /* 信號質量 */
- m26_send_cmd("AT+CREG?\r\n", "OK", 200); /* 網絡注冊信息 */
- m26_send_cmd("AT+CGREG?\r\n", "OK", 200); /* GPRS網絡注冊狀態 */
- /* TCP設置 */
- m26_send_cmd("AT+QIMODE=0\r\n", "OK", 200); /* 配置TCPIP應用模式為非透傳模式 */
- m26_send_cmd("AT+QICSGP=1,\"CMNET\"\r\n", "OK", 200); /* 設置接入點,聯通移動默認CMNET */
- m26_send_cmd("AT+QIREGAPP\r\n", "OK", 200);
- m26_send_cmd("AT+QICSGP?\r\n", "OK", 200);
- m26_send_cmd("AT+QIACT\r\n", "OK", 200);
- m26_send_cmd("AT+QILOCIP\r\n", "QILOCIP", 200); /* 獲取IP */
- /* 連接服務器 */
- m26_send_cmd("ATV1\r\n", "OK", 200);
- m26_send_cmd("AT+QIHEAD=1\r\n", "OK", 200);
- m26_send_cmd("AT+QIDNSIP=1\r\n", "OK", 200);
- m26_send_cmd("AT+QIOPEN=\"UDP\",\"zerochip.in.3322.org\",\"7425\"\r\n", "OK", 200);
-
- /* 發送數據到遠端服務器 */
- m26_send_cmd("AT+QISEND\r\n", ">", 200);
- m26_send_cmd("EasyM26 UDP test.", "SEND OK", 200);
- /* 關閉連接 */
- m26_send_cmd("AT+QICLOSE\r\n", "CLOSE OK", 200);
-
- HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
-
- M26_State++;
- break;
- case 2:
- HAL_Delay(10000);
- M26_State++;
- break;
- default:
- break;
- }
- }
- /**
- * @brief M26模塊基站定位
- */
- void m26_locator_test(void)
- {
- switch(M26_State)
- {
- case 0:
- m26_poweron();
- M26_State++;
- break;
- case 1:
- m26_send_cmd("ATE0\r\n", "OK", 200); /* 關閉回顯 */
- /* 確保模塊工作正常 */
- m26_send_cmd("AT+CPIN?\r\n", "OK", 200); /* 查詢SIM卡狀態 */
- m26_send_cmd("AT+CSQ\r\n", "OK", 200); /* 信號質量 */
- m26_send_cmd("AT+CREG?\r\n", "OK", 200); /* 網絡注冊信息 */
- m26_send_cmd("AT+CGREG?\r\n", "OK", 200); /* GPRS網絡注冊狀態 */
- /* TCP設置 */
- m26_send_cmd("AT+QIMODE=0\r\n", "OK", 200); /* 配置TCPIP應用模式為非透傳模式 */
- m26_send_cmd("AT+QIFGCNT=0\r\n", "OK", 200);
- m26_send_cmd("AT+QICSGP=1,\"FXTX.ZB.SD\"\r\n", "OK", 200); /* 設置接入點,聯通移動默認CMNET. 由于測試使用的是專網卡,所以這里設置了專用接入點 */
- m26_send_cmd("AT+QIREGAPP\r\n", "OK", 200);
- m26_send_cmd("AT+QICSGP?\r\n", "OK", 200);
- m26_send_cmd("AT+QIACT\r\n", "OK", 200);
- m26_send_cmd("AT+QILOCIP\r\n", "QILOCIP", 200); /* 獲取IP */
- /* 獲取位置 */
- m26_send_cmd("AT+QCELLLOC=1\r\n", "+QCELLLOC", 200);
-
- HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
-
- M26_State++;
- break;
- case 2:
- HAL_Delay(10000);
- M26_State++;
- break;
- case 3:
-
- // M26_State++;
- break;
- default:
- break;
- }
- }
- /*-------------------------------------------------------------------*/
- /* 內部函數實現 -----------------------------------------------------*/
- /**
- * @brief M26 模塊開機
- */
- void m26_poweron(void)
- {
- /* 手動開機 */
- // M26_ON_L();
- // M26_PWR_L();
- // HAL_Delay(5000);
- // M26_PWR_H();
- // HAL_Delay(1000);
- // M26_ON_H();
- // HAL_Delay(1000);
- // M26_ON_L();
- // HAL_Delay(5000);
-
- /* 上電等待模塊自啟動 */
- HAL_Delay(10000);
- }
- /**
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
GSM模組M26單片機DEMO例子(基于STM32單片機).7z
(1.13 MB, 下載次數: 293)
2019-3-7 01:09 上傳
點擊文件名下載附件
|