📄 ctrlbq.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 + -