📄 dtmf.c
字号:
//********************** 使用 DTMF 与中心通信 ****************
#include "msp430x14x.h"
#include "main.h"
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//from Dtmf.C
extern unsigned char Get_DTMF(void);
extern void write_CR(unsigned char WriteData);
extern void Write_DTMF(unsigned char WriteData);
extern unsigned char read_SR(void);
extern unsigned char read_DTMF(void);
//form main.c
//用作为 16 个位!BOOLEAN 变量来使用
extern unsigned int g_intMark;
extern unsigned int g_intMarkA;
//from commpc.c
extern unsigned char g_chReceivePCBuf[ReceivePcBufMAX]; //发往PC,最大一信息长度)----------------
extern unsigned char g_chReceivePCHead, g_chReceivePCTail;
extern unsigned char g_chSendPCHead, g_chSendPCTail;
extern unsigned char g_chReceivePCBuf_Stat;
extern unsigned char g_chSendPCBuf_Stat;
extern unsigned char g_chMainPushReport_Stat;
//from debug.c
extern void ExternInsertDebugSendBuf(unsigned char *pData, unsigned int intLen);
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//2002-11-10 14:32 全面检查一遍
//mt8889
//#define PHONE_ON {P6OUT |= OFFHOOK; P6OUT &= ~HOOKLED ; }
//#define PHONE_OFF {P6OUT &= ~OFFHOOK ; P6OUT |= HOOKLED; intMFlag &= ~CommWork_Mark;}
void BuildDTMF(void);
unsigned char g_chBuildDTMF_Stat;
unsigned char g_chBuildDTMFTime_1s;
#define BuildDTMFTime_1sMAX 7
#define BuildDTMFTime_1sPowerMAX 31
#define BuildDTMFTime_1sShakeHandMAX 15
#define BuildDTMFTime_1sRecerivMAX 5
unsigned char g_chBuildDTMFReBuildCount = 0;
#define BuildDTMFReBuildCount_MAX 5
void DtmfPhysicsReceive(void);
unsigned char g_chDtmfPhysicsReceive_50ms;
void DtmfPhysicsSend(void);
unsigned char g_chDtmfPhysicsSendMark;
unsigned char g_chSendDtmf = 0xFF;
unsigned char g_chHandShakeBuf[3];
unsigned char g_chHandShakeTail;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**************************************
*功能: 建立DTMF通信
*参数:
*返回:
*备注: 实时调用,
**************************************/
void BuildDTMF(void)
{
switch(g_chBuildDTMF_Stat)
{
case 0://
g_chBuildDTMF_Stat = 1;
g_chBuildDTMFTime_1s = 0;
break;
case 1://判断震铃 保证时间 7秒 或 16秒
//保持挂机
P6OUT &= ~OFFHOOK;
//不亮
//P2OUT |= CommBuild_LED;-----在这里可能是在使用 RS232 通信呢
//保持一些初始状态
g_intMark &= ~DTMFPhysicsReceiveWorkToPCBuf_Mark;
g_intMark &= ~DtmfPhysicsReceive_Mark;//不可以接受码了
if(g_intMarkA & DTMFCallCenter_MarkA)
{//有中心号码
//
}
else
{
g_intMark &= ~RS232DTMFSendPC_Mark;//使用 RS232资源
}
//在这里不可以 改变 commPc.c 中的处理收发缓冲区里的信息
if(P1IN & RING)
{//高 没有RING
// P2OUT &= ~LCD10;//送低亮
if(g_intMark & PowerOn_Mark)
{//上电还未发送,等待15秒
if(g_chBuildDTMFTime_1s > BuildDTMFTime_1sPowerMAX)
{
g_chBuildDTMF_Stat = 11;//看是否要主动发送了!
}
}
else
{//等待7秒
if(g_chBuildDTMFTime_1s > BuildDTMFTime_1sMAX)
{
g_chBuildDTMF_Stat = 11;//看是否要主动发送了!
}
}
}
else
{//低,有震铃信号
// P2OUT &= ~LCD10;//送低亮
g_chBuildDTMF_Stat = 2;
g_chBuildDTMFTime_1s = 0;
}
break;
case 2://马上取机,接收握手
P6OUT |= OFFHOOK;//取机灯要亮
//亮
P2OUT &= ~CommBuild_LED;
read_SR();//读状态寄存器(清除状态寄存器),以清除接收端可能在状态寄存器中产生的置位
//可以接收码,但必须放在握手缓冲区里
g_chHandShakeBuf[0] = 0xFF;
g_chHandShakeTail = 0;
g_chBuildDTMF_Stat = 3;
//DEBUG --被叫
{
unsigned char chM[] = "被叫\n\r";
ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
}
break;
case 3://等待握手信息 #
g_intMark |= DtmfPhysicsReceive_Mark;//可以接受码了
//在 1 中: g_intMark &= ~DTMFPhysicsReceiveWorkToPCBuf_Mark;
if(g_chHandShakeBuf[0] == '#')
{//表明被动握手成功,正在接收信息
if(g_chReceivePCTail == 0)
{
g_intMark &= ~ICanPush_Mark;//被动发信息
g_intMark |= RS232DTMFSendPC_Mark;//使用DTMF通信----可能会无条件抢用 RS232资源
g_intMark |= CommBuilded_Mark;//通信建立
//清 发送缓冲区------------------------------可能会无条件抢用 RS232资源
g_chSendPCHead = 0;
g_chSendPCTail = 0;
g_chSendPCBuf_Stat = 1;
//接收缓冲区
g_chReceivePCHead = 1;
g_chReceivePCTail = 1;
g_chReceivePCBuf_Stat = 1;//从 1 开始处理
g_chReceivePCBuf[1] = '#';//添上头
g_intMark |= DTMFPhysicsReceiveWorkToPCBuf_Mark;//必须要在这里加上去!
g_chBuildDTMF_Stat = 4;//继续接收
g_chBuildDTMFTime_1s = 0;
}
else
{
{
unsigned char chM[] = "与RS232冲突挂\n\r";
ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
}
//挂机! -----本次被动握手失败!
g_chBuildDTMF_Stat = 9;
}
}
//15 秒 挂机,
if(g_chBuildDTMFTime_1s > BuildDTMFTime_1sShakeHandMAX)
{
g_chBuildDTMF_Stat = 9;
//DEBUG --无握手
{
unsigned char chM[] = "无握手挂3\n\r";
ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
}
}
break;
case 4://正在接收信息
//是否接收完成,有尾巴既完成
//g_intMark |= DTMFPhysicsReceiveWorkToPCBuf_Mark;//可以收 DTMF 码
g_intMark |= DtmfPhysicsReceive_Mark;//可以接受码了
//应该由接收处理去,处理收到完整一信息后,马上转到发送信息
//但要根据情况,有时,在被叫的情况下收到 #2#,除了丢掉发送区的信息后,还要继续接收,而不是发送!
//5 秒 挂机,---有 5 秒还未收到一个码
if(g_chBuildDTMFTime_1s > BuildDTMFTime_1sRecerivMAX)
{
g_chBuildDTMF_Stat = 9;
{
unsigned char chM[] = "收超时挂4\n\r";
ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
}
}
break;
case 5://发送信息
//等待信息发送完成!
g_intMark &= ~DtmfPhysicsReceive_Mark;//不可以接受码了
g_intMark &= ~ICanPush_Mark;//被动发信息
//发送完成后,肯定是接收!接收#2#,或接收新的命令
//5 秒 挂机,按流程肯定有发送,这里还没有发码肯定有问题,
//if(g_chSendPCBuf_Stat == 1)//在等待发送缓冲区里是否有东西
//无条件判断,防止死机
{//在等待发送
//5 秒 挂机,
if(g_chBuildDTMFTime_1s > BuildDTMFTime_1sRecerivMAX)
{
g_chBuildDTMF_Stat = 9;
{
unsigned char chM[] = "发超时挂5\n\r";
ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
}
}
}
break;
case 9://挂机!
g_intMark &= ~CommBuilded_Mark;//通信断开
g_chBuildDTMF_Stat = 1;
g_chBuildDTMFTime_1s = 0;
//DEBUG --挂
{
unsigned char chM[] = "挂9\n\r";
ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
}
break;
case 11://需要主动拨号吗
if((g_intMark & RS232DTMFSendPC_Mark) && (g_intMarkA & DTMFCallCenter_MarkA))
{//使用DTMF通信,才去主动拨号 有中心号码吗
g_chBuildDTMF_Stat = 12;
}
else
{
g_chBuildDTMF_Stat = 1;
g_chBuildDTMFTime_1s = 0;
}
break;
case 12://
if(g_intMark & ReportPC_Mark)
{//有状态改变要报告
g_chBuildDTMF_Stat = 13;
g_chBuildDTMFTime_1s = 0;
}
else
{//无要主动报告的东西
g_chBuildDTMF_Stat = 1;
g_chBuildDTMFTime_1s = 0;
}
break;
case 13://主动取机
P6OUT |= OFFHOOK;//取机灯要亮
//亮
P2OUT &= ~CommBuild_LED;
//1-2秒后 才开始拨号
if(g_chBuildDTMFTime_1s > 1)
{
g_chBuildDTMF_Stat = 14;
//DEBUG --主叫
{
unsigned char chM[] = "主叫\n\r";
ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
}
}
break;
case 14://拨号
{
unsigned char chI;
for(chI = 0; chI < 18; chI++)
{
if(*(unsigned char *)(DesTeleID_Info + chI) != '9')
{
break;//记录了中心号码开始位置
}
}
if(chI >= 17)
{//号码长度 = 1,或无
g_intMarkA &= ~DTMFCallCenter_MarkA;//中心无号码,且不需要在其他地方初始化
g_chBuildDTMF_Stat = 1;
g_chBuildDTMFTime_1s = 0;
}
else
{//发电话号码
g_chBuildDTMF_Stat = 15;
g_chHandShakeTail = chI;//借用该变量
}
}
break;
case 15://发电话号码
if(g_chHandShakeTail < 18)
{
if(g_chSendDtmf == 0xFF)
{
g_chSendDtmf = *(unsigned char *)(DesTeleID_Info + g_chHandShakeTail);
g_chHandShakeTail++;
}
}
else
{
if(g_chSendDtmf == 0xFF)
{//保证发完了码!
g_chBuildDTMF_Stat = 16;//接收
g_chHandShakeTail = 0;
//清理缓冲区
g_chHandShakeBuf[0] = 0;
g_chHandShakeBuf[1] = 0;
g_chHandShakeBuf[2] = 0;
}
}
break;
case 16://不用在这里清收码,收握手
g_intMark |= DtmfPhysicsReceive_Mark;//可以接受码了
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -