程序源代码.docx
- 文档编号:6122483
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:23
- 大小:23.09KB
程序源代码.docx
《程序源代码.docx》由会员分享,可在线阅读,更多相关《程序源代码.docx(23页珍藏版)》请在冰豆网上搜索。
程序源代码
//BusDlg.cpp:
实现文件
//
#include"stdafx.h"
#include"Bus.h"
#include"BusDlg.h"
#include
#defineM5//公交车数量
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
/*每辆公交车途经路线*/
intStation[M][20]={{1,2,3,4,5,6,7,8,9,10,11},{12,13,14,15,16,17,18,19},{16,17,20,21,22,23,24,25,26},{2,3,15,16,23,27,28,29,30,31,32,33},{5,7,14,15,16,22,23,34,35,36,37,38}};
inttaked[M]={0,0,0,0,0};//公交车标示,坐过置
intLength[1000]={0};//每条路线长度
intcnt;//路线条数
structways//保存所有路径
{
intcp;//公交车号
intzt;//站台编号
}way[1000][10];
structExchange//换车的下车点
{
staticintLen;//长度
introute;//车次
intpos;//换车站点
}Path[M];
intExchange:
:
Len=0;//初始化路径长度
typedefstruct//定义用户数据结构体
{
chartel[256];//电话
charsstation[256];//起始站
chardstation[256];//终点站
charroute[256];//路线
}userdata;
HANDLEm_hComm;//串口操作句柄
intlength;//路线长度为发送短信使用
//函数声明
voidremessage(userdataud);
char*chazhao(CStringss,CStringds);
DWORDWINAPIGPRSRecvTread(LPVOIDlparam);
voidCALLBACKOnGPRSRecv(CWnd*pWnd,userdataud);
intgsmDecodeUcs2(constunsignedchar*pSrc,char*pDst,intnSrcLength);
char*chuli(char*buff);
boolPassBy(intP,int*path);
voidsave_path();
voidNextSearchPath(intend,introute);
intstat_num(CStringstation);
voidSearchPath(intstart,intend);
intstat_num(CStringstation);
CStringChange_zt(intzt);
CStringChange_cp(intcp);
char*change(CStringnumber);
//用于应用程序“关于”菜单项的CAboutDlg对话框
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//对话框数据
enum{IDD=IDD_ABOUTBOX};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持
//实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
END_MESSAGE_MAP()
//CBusDlg对话框
CBusDlg:
:
CBusDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CBusDlg:
:
IDD,pParent)
{
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCBusDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CBusDlg,CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1,&CBusDlg:
:
OnBnClickedButton1)
END_MESSAGE_MAP()
//CBusDlg消息处理程序
BOOLCBusDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//将“关于...”菜单项添加到系统菜单中。
//IDM_ABOUTBOX必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon(m_hIcon,TRUE);//设置大图标
SetIcon(m_hIcon,FALSE);//设置小图标
//TODO:
在此添加额外的初始化代码
returnTRUE;//除非将焦点设置到控件,否则返回TRUE
}
voidCBusDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。
对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成。
voidCBusDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,reinterpret_cast
//使图标在工作矩形中居中
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//绘制图标
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSORCBusDlg:
:
OnQueryDragIcon()
{
returnstatic_cast
}
/*关闭串口方法实现*/
BOOLCBusDlg:
:
ClosePort()
{
if(m_hComm!
=INVALID_HANDLE_VALUE)
{
SetCommMask(m_hComm,0);
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);//清除收/发缓冲
CloseHandle(m_hComm);//关闭串口操作句柄
m_hComm=INVALID_HANDLE_VALUE;
returnTRUE;
}
returnFALSE;
}
/*打开串口方法实现*/
BOOLCBusDlg:
:
OpenPort(LPCTSTRPort,intBaudRate,intDataBits,intStopBits,intParity)
{
COMMTIMEOUTSCommTimeOuts;
//打开串口
m_hComm=CreateFile(Port,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
if(m_hComm==INVALID_HANDLE_VALUE)
{
MessageBox(_T("无法打开端口或端口已打开!
请检查是否已被占用."));
returnFALSE;
}
GetCommState(m_hComm,&dcb);/*读取串口的DCB*/
dcb.BaudRate=BaudRate;
dcb.ByteSize=DataBits;
dcb.Parity=Parity;
dcb.StopBits=StopBits;
dcb.fParity=FALSE;/*禁止奇偶校验*/
dcb.fBinary=TRUE;
dcb.fDtrControl=0;/*禁止流量控制*/
dcb.fRtsControl=0;
dcb.fOutX=0;
dcb.fInX=0;
dcb.fTXContinueOnXoff=0;
//设置状态参数
SetCommMask(m_hComm,EV_RXCHAR);/*串口事件:
接收到一个字符*/
SetupComm(m_hComm,16384,16384);/*设置接收与发送的缓冲区大小*/
if(!
SetCommState(m_hComm,&dcb))/*设置串口的DCB*/
{
MessageBox(_T("无法按当前参数配置端口,请检查参数!
"));
ClosePort();
returnFALSE;
}
//设置超时参数
GetCommTimeouts(m_hComm,&CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout=100;/*接收字符间最大时间间隔*/
CommTimeOuts.ReadTotalTimeoutMultiplier=1;
CommTimeOuts.ReadTotalTimeoutConstant=100;/*读数据总超时常量*/
CommTimeOuts.WriteTotalTimeoutMultiplier=0;
CommTimeOuts.WriteTotalTimeoutConstant=0;
if(!
SetCommTimeouts(m_hComm,&CommTimeOuts))
{
MessageBox(_T("无法设置超时参数!
"));
ClosePort();
returnFALSE;
}
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);/*清除收/发缓冲区*/
returnTRUE;
}
/*启动*/
voidCBusDlg:
:
init()
{
//TODO:
在此添加控件通知处理程序代码
HANDLEGPRSRecvThread;/*接收GPRS线程句柄*/
DWORDlen;
BOOLret;
ret=OpenPort((CString)"COM6:
",115200,8,ONESTOPBIT,NOPARITY);/*GPRS打开串口*/
if(ret==FALSE)
{
AfxMessageBox((CString)"打开串口失败");
return;
}
charcmd[15];
memset(cmd,'\0',sizeof(cmd));
sprintf(cmd,"AT+CMGF=0\r");/*设置GPRS模块数据格式为PDU格式*/
ret=WriteFile(m_hComm,cmd,strlen(cmd),&len,NULL);
if(ret==FALSE)
{
AfxMessageBox(_T("无法向串口写数据!
"));
}
PurgeComm(m_hComm,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
Sleep(200);
charbuff[25];
memset(buff,'\0',25);
ret=ReadFile(m_hComm,buff,20,&len,NULL);
if(!
ret)
{
AfxMessageBox(_T("无法从串口读数据!
"));
}
PurgeComm(m_hComm,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
//AfxMessageBox((CString)buff);
//创建串口接收线程
GPRSRecvThread=CreateThread(NULL,0,GPRSRecvTread,this,0,NULL);
if(GPRSRecvThread==NULL)
{
MessageBox(_T("创建GPRS接收线程失败!
"));
return;
}
CloseHandle(GPRSRecvThread);
MessageBox(_T("系统启动成功!
"));
}
/*GPRS接受线程*/
DWORDWINAPIGPRSRecvTread(LPVOIDlparam)
{
DWORDdwLength;
char*buff=newchar[256];
char*temp=newchar[300];
char*num=newchar[300];
userdataud;
CBusDlg*pDlg=(CBusDlg*)lparam;
while(TRUE)
{
if(m_hComm!
=INVALID_HANDLE_VALUE)
{
taked[0]=0;taked[1]=0;taked[2]=0;taked[3]=0;taked[4]=0;
memset(Length,0,sizeof(Length));
Exchange:
:
Len=0;
char*recvBuf=newchar[256];//创建缓冲区
memset(recvBuf,'\0',sizeof(recvBuf));
charcmd[32];
memset(cmd,'\0',sizeof(cmd));
sprintf(cmd,"AT+CMGL=0\r");//读取未读短信
BOOLfWriteState=WriteFile(m_hComm,cmd,strlen(cmd),&dwLength,NULL);
if(!
fWriteState)
{
AfxMessageBox(_T("发送指令失败!
"));
}
/*从串口读取数据*/
PurgeComm(m_hComm,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
Sleep(200);
BOOLfReadState=ReadFile(m_hComm,recvBuf,256,&dwLength,NULL);
if(!
fReadState)
{
AfxMessageBox(_T("无法从串口读取数据!
"));
}
else//读取成功
{
buff=recvBuf;
//AfxMessageBox((CString)buff);
/*循环处理每条短信*/
while((buff=strstr(buff,"+CMGL:
"))!
=NULL)//判断数据格式是否正确
{
intn;
AfxMessageBox(_T("收到短信"));
strcpy(num,buff+6);//提取短信在SIM卡中位置
num[3]='\0';
sscanf(num,"%d",&n);//转换成整型给n
//TRACE("%d",n);
buff=strstr(buff,"0891");
strcpy(ud.tel,buff+22);//提取用户手机号码
ud.tel[16]='\0';
/*判断用户发送短信格式是否正确*/
strcpy(ud.sstation,buff+58);
if(!
(temp=strstr(ud.sstation,"FF0C"))&&!
(temp=strstr(ud.sstation,"002C")))
{//如果短信内容中没有逗号(全角,半角)则认为格式错误
sprintf(ud.route,"683C5F0F95198BEF");//格式错误
length=8;
}
else//格式正确
{
*temp='\0';//提取起点站
strcpy(ud.dstation,temp+4);
temp=strstr(ud.dstation,"\r");
*temp='\0';//提取终点站
//核对起点站终点站
inti;
for(i=0;i if(PassBy(stat_num((CString)ud.sstation),Station[i]))break; if(i==M) { AfxMessageBox((CString)"起始站错误"); sprintf(ud.route,"7AD953F0540D79F067098BEF"); length=12; } else { for(i=0;i if(PassBy(stat_num((CString)ud.dstation),Station[i]))break; if(i==M) { AfxMessageBox((CString)"终点站错误"); sprintf(ud.route,"7AD953F0540D79F067098BEF"); length=12; } else { strcpy(ud.route,chazhao((CString)ud.sstation,(CString)ud.dstation));//查找路线 OnGPRSRecv(pDlg,ud);//收到信息后显示 } } } remessage(ud);//将路线信息返回用户,包括错误提示信息 PurgeComm(m_hComm,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); memset(cmd,'\0',sizeof(cmd)); sprintf(cmd,"AT+CMGD=%d\r",n);//将SIM卡中第n条短信删除 fWriteState=WriteFile(m_hComm,cmd,strlen(cmd),&dwLength,NULL); Sleep(200); PurgeComm(m_hComm,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); } } } } return0; } intgsmDecodeUcs2(constunsignedchar*pSrc,char*pDst,intnSrcLength) { intnDstLength
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 源代码