⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctrlbq.c

📁 vc实现手机通讯通过串口与 BENQ 模块 M22 的通讯函数
💻 C
字号:
/*******************************************************************************************************
**
**(c)Copyright 2004 沈阳波尔科技有限公司 All rights reserved.
**
**--------------文件信息--------------------------------------------------------------------------------
**
**文   件   名: CtrlBQ.c
**创   建   人: 陈征(Eric.Chen)
**最后修改日期: 2004.07
**描        述: 通过串口与 BENQ 模块 M22 的通讯函数
**              
**
**--------------历史版本信息----------------------------------------------------------------------------
**
** 创建人: 陈征(Eric.Chen)
** 版  本: v1.0
** 日 期: 2004.07
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
**
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
**
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include  <msp430x14x.h>
#include  "modem.h"

extern void delayms(uint num);

void BENQInit(void);
void PowerOffBQ(void);
void SendBQ(uchar *buf, uint len);
void ReadMsg(uchar num);
void DelMsg(uchar num);
void SendAT(void);
void BQSetMsgCen(uchar *buf, uchar len);
void DialUp(uchar *buf, uchar len);
void HangUp(void);
void AnswerTel(void);
void SendMsg(uchar enorcn, uchar *buf, uchar len);

extern uchar g_SendMsgNumLen;
extern uchar g_SendMsgNum[MSGCENLEN];
/*----------------------------------------------------------------------------------
*函数介绍:BENQ_GSM(M22)模块初始化
*输入参数:无
*输出参数:无
*返 回 值:无
*/
void BENQInit(void)
{
	uchar i;
	delayms(200);
	PWON_L;
	delayms(1000);
	PWON_H;
	for (i = 0; i < 18; i++)
	{
		delayms(1000);
	}
	SendAT();
	delayms(100);
	SendBQ("AT$NOSLEEP=1\r\n", 14);	//取消休眠状态
	delayms(100);
	SendBQ("AT+CLIP=1\r\n", 11);	//设置来电显示
	delayms(100);
	SendBQ("AT+CMGF=0\r\n", 11);	//设置短信格式为PDU格式
	delayms(100);
	SendBQ("AT$AUPATH=3,1\r\n", 15);//设置语音通道
	delayms(100);
}

/*----------------------------------------------------------------------------------
*函数介绍:关闭
*输入参数:无
*输出参数:无
*返 回 值:无
*/
void PowerOffBQ(void)
{
	SendBQ("AT+POWEROFF\r\n", 13);
}

/*----------------------------------------------------------------------------------
*函数介绍:通过串口向BENQ模块发送数据
*输入参数:uchar* buf 发送数据指针 uint len 发送数据长度
*输出参数:无
*返 回 值:无
*/
void SendBQ(uchar *buf, uint len)
{
	uint i;
	
	for (i = 0; i < len; i++)
	{
		TXBUF0 = buf[i];
		while ((UTCTL0 & 0x01) == 0);
	}
}

/*----------------------------------------------------------------------------------
*函数介绍:向BENQ模块发送AT\r\n
*输入参数:无
*输出参数:无
*返 回 值:无
*/
void SendAT(void)
{
	SendBQ("AT\r\n", 4);
}

/*----------------------------------------------------------------------------------
*函数介绍:设置短信中心号码
*输入参数:uchar *buf 号码地址 uchar len 号码长度
*输出参数:无
*返 回 值:无
*/
void BQSetMsgCen(uchar *buf, uchar len)
{
//	SendAT();
//	delayms(10);
	SendBQ("AT+CSCA=\"+", 10);
	SendBQ(buf, len);
	SendBQ("\",145\r\n", 7);
}

/*----------------------------------------------------------------------------------
*函数介绍:读第num条短信
*输入参数:uchar num 第num条
*输出参数:无
*返 回 值:无
*/
void ReadMsg(uchar num)
{
//	SendAT();
//	delayms(10);
	num += 0x30;
	SendBQ("AT+CMGR=", 8);
	SendBQ(&num, 1);
	SendBQ("\r\n", 2);
}

/*----------------------------------------------------------------------------------
*函数介绍:删除第num条短信
*输入参数:uchar num 第num条
*输出参数:无
*返 回 值:无
*/
void DelMsg(uchar num)
{
//	SendAT();
//	delayms(10);
	num += 0x30;
	SendBQ("AT+CMGD=", 8);
	SendBQ(&num, 1);
	SendBQ("\r\n", 2);
}

/*----------------------------------------------------------------------------------
*函数介绍:接听来电
*输入参数:无
*输出参数:无
*返 回 值:无
*/
void AnswerTel(void)
{
	SendBQ("ATA\r\n", 5);
}

/*----------------------------------------------------------------------------------
*函数介绍:挂机
*输入参数:无
*输出参数:无
*返 回 值:无
*/
void HangUp(void)
{
	SendBQ("ATH\r\n", 5);
}

/*----------------------------------------------------------------------------------
*函数介绍:拨号
*输入参数:uchar *buf 号码地址 uchar len 号码长度
*输出参数:无
*返 回 值:无
*/
void DialUp(uchar *buf, uchar len)
{
	SendBQ("ATD", 3);
	SendBQ(buf, len);
	SendBQ(";\r\n", 3);
}

/*----------------------------------------------------------------------------------
*函数介绍:恢复出厂设置
*输入参数:无
*输出参数:无
*返 回 值:无
*/
void ReFactory(void)
{
	SendBQ("AT&F\r\n", 6);
}

/*----------------------------------------------------------------------------------
*函数介绍:发送短信
*输入参数:无
*输出参数:无
*返 回 值:无
*/
void SendMsg(uchar enorcn, uchar *buf, uchar len)
{
	uchar i,j,k;
	uchar temp1,temp2;
	//发送头
	SendBQ("AT+CMGS=", 8);
	
	//发送长度
	if (ENCODE == enorcn)
	{
		j = (4 + (g_SendMsgNumLen + 1) / 2 + 3 + len - len /8 );
	}
	else
	{
		j = (4 + (g_SendMsgNumLen + 1) / 2 + 3 + len );
	}
	if (j < 10) 
	{
		j += 0x30;
		SendBQ(&j, 1);
	}
	else
	{
		if (j < 100)
		{
			k = j / 10 + 0x30;
			SendBQ(&k, 1);
			k = (j % 10) + 0x30;
			SendBQ(&k, 1);
		}
		else
		{
			k = (j / 100) + 0x30;
			SendBQ(&k, 1);
			k = ((j % 100) / 10) + 0x30;
			SendBQ(&k, 1);
			k = (j % 10) + 0x30;
			SendBQ(&k, 1);
		}
	}
	
	//等待输出'>'
	SendBQ("\r", 1);
	delayms(100);
	SendBQ("000103",6);
	
	//发送对方号码长度
	j = g_SendMsgNumLen / 16 + 0x30;
	SendBQ(&j, 1);
	j = ((g_SendMsgNumLen & 0x0f) < 0x0a)? ((g_SendMsgNumLen & 0x0f) + 0x30) : ((g_SendMsgNumLen & 0x0f) + 0x37);
	SendBQ(&j, 1);
	
	SendBQ("91", 2);
	//发送对方号码
	for (i = 0; i < ((g_SendMsgNumLen + 1) / 2); i++)
	{
		j = ((g_SendMsgNum[i] / 16) < 0x0a)? (g_SendMsgNum[i] / 16 + 0x30) : (g_SendMsgNum[i] / 16 + 0x37);
		SendBQ(&j, 1);
		j = ((g_SendMsgNum[i] & 0x0f) < 0x0a)? ((g_SendMsgNum[i] & 0x0f) + 0x30) : ((g_SendMsgNum[i] & 0x0f) + 0x37);
		SendBQ(&j, 1);
	}
	
	//发送编码格式
	if (ENCODE == enorcn)
	{
		SendBQ("0000", 4);
	}
	else
	{
		SendBQ("0008", 4);
	}
	
	//发送短信长度
	j = ((len / 16) < 0x0a)? (len / 16 + 0x30) : (len / 16 + 0x37);
	SendBQ(&j, 1);
	j = ((len & 0x0f)< 0x0a)? ((len & 0x0f) + 0x30) : ((len & 0x0f) + 0x37);
	SendBQ(&j, 1);
	
	//发送短信内容
	if (ENCODE == enorcn)
	{
		len = len - len / 8;
		j = 0;
		k = 0;
		for (i = 0; i < len; i++) 
		{
			temp1 = (buf[j] >> k) | (buf[j + 1] << (7 - k));
			temp2 = ((temp1 / 16) < 0x0a)? (temp1 / 16 + 0x30) : (temp1 / 16 + 0x37);
			SendBQ(&temp2, 1);
			temp2 = ((temp1 & 0x0f)< 0x0a)? ((temp1 & 0x0f) + 0x30) : ((temp1 & 0x0f) + 0x37);
			SendBQ(&temp2, 1);
			j++;
			k = (k + 1) % 7;
			if (0 == k)
			{
				j++;
			}
		}
	}
	else
	{
		j = 0;
		k = 0;
		for (i = 0; i < len; i++) 
		{
			//temp1 = (buf[j] >> k) | (buf[j + 1] << (7 - k));
			temp2 = ((buf[i] / 16) < 0x0a)? (buf[i] / 16 + 0x30) : (buf[i] / 16 + 0x37);
			SendBQ(&temp2, 1);
			temp2 = ((buf[i] & 0x0f)< 0x0a)? ((buf[i] & 0x0f) + 0x30) : ((buf[i] & 0x0f) + 0x37);
			SendBQ(&temp2, 1);
//			j++;
//			k = (k + 1) % 7;
//			if(0 == k)
//			{
//				j++;
//			}
		}
	}
	temp1 = 0x1a;
	SendBQ(&temp1, 1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -