標(biāo)題:
GSM模組M26的STM32單片機DEMO程序源碼
[打印本頁]
作者:
cwl0127
時間:
2018-9-1 09:49
標(biāo)題:
GSM模組M26的STM32單片機DEMO程序源碼
M26模組的應(yīng)用例子,包括接聽語音呼叫、模塊撥號測試、GSM錄音、使用 TEXT 模式發(fā)送短信、使用 PDU 模式發(fā)送短信、藍(lán)牙傳輸測試
、TCP連接測試、UDP透傳測試、模塊基站定位
EasyM26每一個功能實驗對應(yīng)一個函數(shù)實現(xiàn),
當(dāng)要驗證某一功能時, 只需要將主函數(shù) while
循環(huán)下該函數(shù)前注釋刪掉.
單片機源程序如下:
/**
* @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 發(fā)短信(TEXT模式) */
// m26_sms_pdu(); /* 實驗5 發(fā)短信(PDU模式) */
// m26_bt_master(); /* 實驗6 藍(lán)牙主機模式 */
// m26_bt_slave(); /* 實驗7 藍(lán)牙從機模式 */
// 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****/
復(fù)制代碼
/**
* @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;
/*-------------------------------------------------------------------*/
/* 內(nèi)部函數(shù)原型 -----------------------------------------------------*/
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卡狀態(tài) */
m26_send_cmd("AT+CSQ\r\n", "OK", 200); /* 信號質(zhì)量 */
m26_send_cmd("AT+CREG?\r\n", "OK", 200); /* 網(wǎng)絡(luò)注冊信息 */
m26_send_cmd("AT+CGREG?\r\n", "OK", 200); /* GPRS網(wǎng)絡(luò)注冊狀態(tài) */
/* 顯示被叫識別 */
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:
/* 接收到一次數(shù)據(jù) */
if (USART2RxSta & 0x8000)
{
/* 添加結(jié)束符 */
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 模式發(fā)送短信
*/
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 模式發(fā)送短信
*/
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 藍(lán)牙主機模式
*/
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); /* 打開藍(lán)牙模塊 */
m26_send_cmd("AT+QBTUNPAIR=1\r\n", "OK", 200); /* 刪除已配對藍(lán)牙設(shè)備 */
m26_send_cmd("AT+QBTSCAN\r\n", "OK", 1000); /* 掃描藍(lán)牙設(shè)備, 等待10s */
M26_State++;
break;
case 2:
if (USART2RxSta & 0x8000)
{
/* 添加結(jié)束符 */
USART2RxBuf[USART2RxSta & 0x7FFF] = 0;
if (strstr((char*)USART2RxBuf, (char*)"+QBTSCAN:0"))
{
M26_State++;
}
USART2RxSta = 0;
}
break;
case 3:
/* 配對, 藍(lán)牙設(shè)備列表第一個掃描到設(shè)備, 等待10s */
m26_send_cmd("AT+QBTPAIR=1\r\n", "+QBTPAIR", 1000);
/* 接受配對 */
m26_send_cmd("AT+QBTPAIRCNF=1\r\n", "+QBTPAIRCNF", 200);
USART2RxSta = 0; /* 清接收狀態(tài) */
M26_State++;
break;
case 4:
if (USART2RxSta & 0x8000)
{
/* 添加結(jié)束符 */
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:
/* 發(fā)送數(shù)據(jù)到從機(這里以手機為例) */
m26_send_cmd("EasyM26, BT 主機模式測試.\r\n", "+QBTCONN", 200);
HAL_Delay(10000);
break;
default:
break;
}
}
/**
* @brief M26 藍(lán)牙從機模式
*/
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); /* 打開藍(lán)牙模塊 */
m26_send_cmd("AT+QBTVISB=1\r\n", "OK", 200); /* 設(shè)置 M26 藍(lán)牙可見 */
m26_send_cmd("AT+QBTNAME=\"M26\"\r\n", "OK", 200); /* 藍(lán)牙名稱 */
/* 清接收狀態(tài), 準(zhǔn)備接收配對 */
USART2RxSta = 0;
M26_State++;
break;
case 2:
if (USART2RxSta & 0x8000)
{
/* 添加結(jié)束符 */
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); /* 關(guān)閉回顯 */
/* 確保模塊工作正常 */
m26_send_cmd("AT+CPIN?\r\n", "OK", 200); /* 查詢SIM卡狀態(tài) */
m26_send_cmd("AT+CSQ\r\n", "OK", 200); /* 信號質(zhì)量 */
m26_send_cmd("AT+CREG?\r\n", "OK", 200); /* 網(wǎng)絡(luò)注冊信息 */
m26_send_cmd("AT+CGREG?\r\n", "OK", 200); /* GPRS網(wǎng)絡(luò)注冊狀態(tài) */
/* TCP設(shè)置 */
m26_send_cmd("AT+QIMODE=0\r\n", "OK", 200); /* 配置TCPIP應(yīng)用模式為非透傳模式 */
m26_send_cmd("AT+QICSGP=1,\"FXTX.ZB.SD\"\r\n", "OK", 200); /* 設(shè)置接入點,聯(lián)通移動默認(rèn)CMNET. 由于測試使用的是專網(wǎng)卡,所以這里設(shè)置了專用接入點 */
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 */
/* 連接服務(wù)器 */
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);
/* 發(fā)送數(shù)據(jù)到遠(yuǎn)端服務(wù)器 */
m26_send_cmd("AT+QISEND=18\r\n", ">", 200);
m26_send_cmd("zerochip easy m26.", "SEND OK", 200);
/* 關(guān)閉連接 */
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); /* 關(guān)閉回顯 */
/* 確保模塊工作正常 */
m26_send_cmd("AT+CPIN?\r\n", "OK", 200); /* 查詢SIM卡狀態(tài) */
m26_send_cmd("AT+CSQ\r\n", "OK", 200); /* 信號質(zhì)量 */
m26_send_cmd("AT+CREG?\r\n", "OK", 200); /* 網(wǎng)絡(luò)注冊信息 */
m26_send_cmd("AT+CGREG?\r\n", "OK", 200); /* GPRS網(wǎng)絡(luò)注冊狀態(tài) */
/* TCP設(shè)置 */
m26_send_cmd("AT+QIMODE=0\r\n", "OK", 200); /* 配置TCPIP應(yīng)用模式為非透傳模式 */
m26_send_cmd("AT+QICSGP=1,\"CMNET\"\r\n", "OK", 200); /* 設(shè)置接入點,聯(lián)通移動默認(rèn)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 */
/* 連接服務(wù)器 */
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);
/* 發(fā)送數(shù)據(jù)到遠(yuǎn)端服務(wù)器 */
m26_send_cmd("AT+QISEND\r\n", ">", 200);
m26_send_cmd("EasyM26 UDP test.", "SEND OK", 200);
/* 關(guān)閉連接 */
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); /* 關(guān)閉回顯 */
/* 確保模塊工作正常 */
m26_send_cmd("AT+CPIN?\r\n", "OK", 200); /* 查詢SIM卡狀態(tài) */
m26_send_cmd("AT+CSQ\r\n", "OK", 200); /* 信號質(zhì)量 */
m26_send_cmd("AT+CREG?\r\n", "OK", 200); /* 網(wǎng)絡(luò)注冊信息 */
m26_send_cmd("AT+CGREG?\r\n", "OK", 200); /* GPRS網(wǎng)絡(luò)注冊狀態(tài) */
/* TCP設(shè)置 */
m26_send_cmd("AT+QIMODE=0\r\n", "OK", 200); /* 配置TCPIP應(yīng)用模式為非透傳模式 */
m26_send_cmd("AT+QIFGCNT=0\r\n", "OK", 200);
m26_send_cmd("AT+QICSGP=1,\"FXTX.ZB.SD\"\r\n", "OK", 200); /* 設(shè)置接入點,聯(lián)通移動默認(rèn)CMNET. 由于測試使用的是專網(wǎng)卡,所以這里設(shè)置了專用接入點 */
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;
}
}
/*-------------------------------------------------------------------*/
/* 內(nèi)部函數(shù)實現(xiàn) -----------------------------------------------------*/
/**
* @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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
GSM模組M26單片機DEMO例子(基于STM32單片機).7z
(1.13 MB, 下載次數(shù): 293)
2019-3-7 01:09 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
l456789
時間:
2018-11-23 22:52
不錯,正好學(xué)習(xí)學(xué)習(xí)。
作者:
lyons168
時間:
2018-11-30 11:52
我試試,感謝分享。
作者:
王子亨
時間:
2018-12-4 10:55
謝謝分析,樓主是在什么硬件上跑的?
作者:
zlbll
時間:
2019-4-10 15:29
正號學(xué)習(xí),用處比較大
作者:
289526422
時間:
2019-5-17 08:38
正有需要,下載學(xué)習(xí)
作者:
geyue12345
時間:
2019-7-5 15:04
正需要,非常感謝樓主分享
作者:
mifeng2019
時間:
2019-7-20 18:07
學(xué)習(xí)一下謝謝!
作者:
ziyexuan
時間:
2019-9-17 10:03
很不錯的分享,學(xué)習(xí)一下,多謝樓主。
作者:
menghong_4
時間:
2019-9-23 15:42
多謝,參考一下
作者:
ruiyuchu
時間:
2019-10-11 16:50
謝謝分享。
作者:
810780579
時間:
2020-2-14 15:09
謝謝了 對我?guī)椭艽?img src="static/image/smiley/default/em04.gif" smilieid="4" border="0" alt="" />
作者:
czg516@sina.com
時間:
2020-2-19 22:18
謝謝,正好有用
作者:
tomnj
時間:
2020-4-8 16:47
謝謝,下載學(xué)習(xí)
作者:
sziitjiang
時間:
2021-4-27 11:27
有對應(yīng)的板子嗎?電路圖也可以
作者:
ymkfbj
時間:
2022-2-16 10:24
gooood
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1