用M35GSM模块及STM32F103CB做基于DTMF移动数据通信的远程开关控制
王昌世/wcs//2014-12-30
1.功能描述:可用手机,固话完成基于DTMF的移动数据通信的3路远程开关输出控制。
2.关键词:DTMF 移动 数据通信 M35 GSM STM32F103CB 远程 开关控制
3 硬件电路
在原M35(或其它GSM模块)和STM32F103CB(或其它单片机)为主的电路上只要加上下面的简单电路和单片机I/O脚相连即可。 4.软件
在原有GSM工作AT命令基础上
[1] 加上这5个专为DTMF通信的AT 命令
char QTONEP0[]=\选择DTMF 音源通道。 char QTONEDET1[]=\ 开放DTMF功能。
char QTONEDET413[]=\ 降低DTMF检测灵敏度,以防重复检测。 char QSFR7[]=\优先选用EFR(增强型全速率语音编码)。 char VTD3[]=\音持续时间
//选择第2通道做语音,第1通道做DTMY音远源。 原有的: //Set audio
ClearGSMReceBuffer();
SendDataPackage(\ delay_ms(500);
//Micphone
ClearGSMReceBuffer();
SendDataPackage(QMIC210);///2,10//Select MIC VALUE.
Timer20msCount=200; //在20MS 的SYSTEEM TICK 中被减一。//4S while(Timer20msCount) {
if(FindStr(RE_OK,GSMReceBuffer)) break; if(FindStr(RE_ERROR,GSMReceBuffer)) {
ClearGSMReceBuffer();
///SendDataPackage(CMIC010); delay_ms(300); }///
if(Timer20msCount<3) {
break;
}//ReStartMachine;} }
//Speaker
ClearGSMReceBuffer();
SendDataPackage(CLVL50);///Select voice SPEAKER VALUE.
Timer20msCount=200; while(Timer20msCount) {
if(FindStr(RE_OK,GSMReceBuffer)) break; if(FindStr(RE_ERROR,GSMReceBuffer)) {
ClearGSMReceBuffer();
///SendDataPackage(CMIC010); delay_ms(300); }///
if(Timer20msCount<3) {
break;
}//ReStartMachine;} } //
ClearGSMReceBuffer();
SendDataPackage(CRSL100);///Select CALLING voice VALUE. Timer20msCount=200;
//DTMF
ClearGSMReceBuffer();
SendDataPackage(\ delay_ms(500);
ClearGSMReceBuffer();
SendDataPackage(QTONEDET1);/// //SendDataPackage(QTONEDET413);///
Timer20msCount=20; while(Timer20msCount) {
if(FindStr(RE_OK,GSMReceBuffer)) break; if(FindStr(RE_ERROR,GSMReceBuffer)) {
ClearGSMReceBuffer();
SendDataPackage(QTONEDET1);/// //SendDataPackage(QTONEDET413); delay_ms(300); }///
if(Timer20msCount<3) {
break;
}//ReStartMachine;} }
ClearGSMReceBuffer();
//SendDataPackage(QTONEDET1);/// SendDataPackage(QTONEDET413);///
Timer20msCount=20; while(Timer20msCount) {
if(FindStr(RE_OK,GSMReceBuffer)) break; if(FindStr(RE_ERROR,GSMReceBuffer)) {
ClearGSMReceBuffer();
//SendDataPackage(QTONEDET1);/// SendDataPackage(QTONEDET413); delay_ms(300); }///
if(Timer20msCount<3) {
break;
}//ReStartMachine;} }
ClearGSMReceBuffer();
SendDataPackage(QSFR7);///Select voice VALUE. delay_ms(300);
ClearGSMReceBuffer();
SendDataPackage(VTD3);///Select voice VALUE. delay_ms(300);
有了这些语音设置,就可以做DTMF通信(在手机或固话与终端设备间)。
[2] DTMF接收处理函数
/***********************************************************************************/ //Editor:wcs
//Time:2014-12-23
//Function name :void ProcessDTMF(void).
//Descrip:According to controling protocol receiving and transimitting DTMF. //[1]Control protocol //(1)Confirm password // Re:*123456#
// Tr:11->Correct;999->Error. // 2) Control out command
// (1) *111#->First channel output open. // (2) *110#->First channel output close. // (3) *121#->Second channel output open. // (4) *120#->Second channel output close. // (5) *131#->Third channel output open. // (6) *130#->Third channel output close.
// \
// (7) *#->End.After this,if need processing DTMF ,THEN must again input password.
//[2]Processing mode
// (1)In GSM receiving interrupt ,Build processing flag for telling main() when get +QTONE.//+QTONEDET: 54
//Input: no. 36 //Out:No.
/******************************************************/ void ProcessDTMF(void) {//+QTONEDET: 54
u8 RepeatSendCounter3;
char CLVL0[]=\ char CLVL50[]=\ if(MuteFlag==1) {
//MuteFlag=0;
//ClearGSMReceBuffer();
//SendDataPackage(\ SendDataPackage(CLVL0);//Close voice. delay_ms(300);
///ClearBuffer(DTMF_Data,20); ///DTMF_DataCounter=0; DTMF_DataFlag=0;
goto DTMF_End; }
//Has Received a #
//Close mute,Begin voice ///ClearGSMReceBuffer();
//SendDataPackage(\ SendDataPackage(CLVL50);//open voice. delay_ms(300);
if(DTMF_Data[1]=='#') //End DTMF operating {
ConfirmPasswordFlag=0;//
ClearBuffer(DTMF_Data,20); DTMF_DataCounter=0; DTMF_DataFlag=0; }
else if(DTMF_Data[7]=='#') //Password operating {//Password
if(FindStr(mima,DTMF_Data)) {//PassWord is correct
ConfirmPasswordFlag=1;// goto DTMF_CorrectEnd; } else
goto PasswordError; }
else if(DTMF_Data[4]=='#') //End a DTMF operating {
if(ConfirmPasswordFlag==1) {
//Open output channel 1
if(FindStr(\ {//Command is correct
//respose major machine command,transmit 11 DTMF
//exec command O1ON;
goto DTMF_CorrectEnd; }
//Close output channel 1
else if(FindStr(\ {//Command is correct
//respose major machine command,transmit 11 DTMF
//exec command O1OFF;
goto DTMF_CorrectEnd; }
//Open output channel 2
else if(FindStr(\ {//Command is correct
//respose major machine command,transmit 11 DTMF
//exec command O2ON;
goto DTMF_CorrectEnd; }
//Close output channel 2
else if(FindStr(\ {//Command is correct
//respose major machine command,transmit 11 DTMF
//exec command O2OFF;
goto DTMF_CorrectEnd;