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

📄 demodlg.cpp

📁 利用西门子的GSM芯片(TC35)的手机模块实现短信的读写
💻 CPP
字号:
// DemoDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Demo.h"
#include "DemoDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

int		receivenumber;			//接收字节数
char	receivebuffer[200];		//接收缓冲区

/////////////////////////////////////////////////////////////////////////////
// CDemoDlg dialog

CDemoDlg::CDemoDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDemoDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDemoDlg)
	m_strnumber = _T("");
	m_strsend = _T("");
	m_strreceive = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDemoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDemoDlg)
	DDX_Control(pDX, IDC_RECEIVEEDIT, m_ctlreceiveedit);
	DDX_Control(pDX, IDC_BUTTONSEND, m_ctlbuttonsend);
	DDX_Control(pDX, IDC_PORTCOMBO, m_ctlportcombo);
	DDX_Control(pDX, IDC_DISPLAYCOMBO, m_ctldisplaycombo);
	DDX_Control(pDX, IDC_SENDEDIT, m_ctlsendedit);
	DDX_Control(pDX, IDC_DISPLAYVC, m_displayvc);
	DDX_Text(pDX, IDC_NUMBEREDIT, m_strnumber);
	DDV_MaxChars(pDX, m_strnumber, 20);
	DDX_Text(pDX, IDC_SENDEDIT, m_strsend);
	DDV_MaxChars(pDX, m_strsend, 70);
	DDX_Text(pDX, IDC_RECEIVEEDIT, m_strreceive);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDemoDlg, CDialog)
	//{{AFX_MSG_MAP(CDemoDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_SHOWWINDOW()
	ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)
	ON_BN_CLICKED(IDC_BUTTONCLEARSEND, OnButtonclearsend)
	ON_BN_CLICKED(IDC_BUTTONCLEARRECEIVE, OnButtonclearreceive)
	ON_CBN_SELCHANGE(IDC_PORTCOMBO, OnSelchangePortcombo)
	ON_BN_CLICKED(IDC_BUTTONSEND, OnButtonsend)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDemoDlg message handlers

BOOL CDemoDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	m_Port.InitPort(this,1,9600);
	m_Port.StartMonitoring();
	m_ctlportcombo.SetCurSel(0);
	m_ctldisplaycombo.SetCurSel(0);
	receivenumber = 0;
	memset(&receivebuffer,0,sizeof(receivebuffer));
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CDemoDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDemoDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

BOOL CDemoDlg::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	return CDialog::Create(IDD, pParentWnd);
}

void CDemoDlg::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CRect rRect;
	int iHeight;

	CDialog::OnShowWindow(bShow, nStatus);
	
	// TODO: Add your message handler code here	
	m_displayvc.GetWindowRect(&rRect);
	iHeight = rRect.top - rRect.bottom;
	if (iHeight < 0)
		iHeight = 0 - iHeight;
	m_fSampFont.Detach();
	m_fSampFont.CreateFont(64,0,0,0, FW_BLACK,
		0,0,0,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,
		CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | 
		FF_DONTCARE, "Arial");
	m_displayvc.SetFont(&m_fSampFont);
}

void CDemoDlg::OnButtonclearsend() 
{
	// TODO: Add your control notification handler code here
	m_ctlsendedit.SetSel(0xFF,FALSE);
	m_ctlsendedit.Clear();
	m_ctlsendedit.SetFocus();
}

void CDemoDlg::OnButtonclearreceive() 
{
	// TODO: Add your control notification handler code here
	m_strreceive = "";
	UpdateData(FALSE);
}


void CDemoDlg::OnSelchangePortcombo() 
{
	// TODO: Add your control notification handler code here
	if(m_Port.InitPort(this,m_ctlportcombo.GetCurSel()+1,9600))
	{
		m_Port.StartMonitoring();
		m_ctlbuttonsend.EnableWindow(TRUE);
	}
	else
	{
		m_ctlbuttonsend.EnableWindow(FALSE);
		AfxMessageBox("打开端口错误",MB_OK+MB_ICONSTOP,0);
	}
}

void CDemoDlg::OnButtonsend() 
{
	// TODO: Add your control notification handler code here

	char buf[200];
	wchar_t wstr[70];
	char str[140];
	int m ;
	int n ;
	BYTE i;
	UpdateData(TRUE);
	memset(&buf, 0, sizeof(buf));
	memset(&str,0,sizeof(str));
	memset(&wstr,0,sizeof(wstr));

	buf[0] = char(0xAA);                 //帧头
	buf[1] = char(0x01);				//命令
	m = strlen(m_strnumber);		//号码长度
	strcpy(&buf[2],m_strnumber);		//号码
	strcpy(str,m_strsend);
	MultiByteToWideChar(936,MB_PRECOMPOSED,str,-1,wstr,70);
	n= 2*wcslen(wstr);		//内容长度
	for(i=0;i<wcslen(wstr);i++)			//内容
	{
		buf[2*i+2+m] = char(wstr[i]>>8);
		buf[2*i+3+m] = char(wstr[i]);
	}									
	m_Port.WriteToPort(buf,m+n+2);
	m_ctlbuttonsend.EnableWindow(FALSE);
	SetTimer(1,6000,NULL);
}

int SH_ConvertUnicodeHexStr2AnsiStr( char *UnicodeHexStr, char *AnsiStr)
{	
	int   rawLen;
	int   curVal;	//当前Unicode字符对应的数值
	int   curHex[4];		//十六进制的4位
	int   i,j,curResPos,q;
	char  curStr[3];
	WCHAR *pWStr;

	pWStr = new WCHAR[2];
	char szTemp[400];
	memset(szTemp, 0x0, 400);
	strcpy(szTemp,UnicodeHexStr);

	CString strTemp;


	int nLen = strlen(szTemp);
	UnicodeHexStr[0] = 0;
	for (int l=0;l<nLen;l++)
	{			
		int nTemp = szTemp[l];
		if (szTemp[l] < 0)
		{
			nTemp +=256;
		}
		strTemp.Format("%x", nTemp/16);
		strcat(UnicodeHexStr,strTemp);
		strTemp.Format("%x", nTemp%16);
		strcat(UnicodeHexStr, strTemp);
	}
	
	//1. 将UnicodeHexStr里的内容转换成Unicode字符
	rawLen = strlen(UnicodeHexStr);
	curResPos = 0;
	for(i=0; i<rawLen; i+=4)
	{	for(j=0;j<4;j++)
		{	if(*(UnicodeHexStr+i+j)>='0' && *(UnicodeHexStr+i+j)<='9')
			{	curHex[j] = *(UnicodeHexStr+i+j)-'0';
			}
			else if(*(UnicodeHexStr+i+j)>='A' && *(UnicodeHexStr+i+j)<='F')
			{	curHex[j] = *(UnicodeHexStr+i+j)-'A'+10;
			}
			else if(*(UnicodeHexStr+i+j)>='a' && *(UnicodeHexStr+i+j)<='f')
			{	curHex[j] = *(UnicodeHexStr+i+j)-'a'+10;
			}
			else
			{	return -1;
			}
		}
		//将取到的四个数字转换成一个整型数字
		curVal = 0; q=1;
		for(j=3;j>=0;j--)
		{	curVal += (q*curHex[j]);
			q *= 16;
		}
		*pWStr = curVal;
		*(pWStr+1) = 0;
		WideCharToMultiByte( CP_ACP, 0,pWStr, -1,
			curStr, 256, NULL, NULL );
		if((unsigned char)(*curStr)>128)
		{	AnsiStr[curResPos] = *curStr;
			curResPos++; 
			AnsiStr[curResPos] = *(curStr+1);
			curResPos++;
		}
		else
		{	AnsiStr[curResPos] = *curStr;
			curResPos++; 
		}
	}
	AnsiStr[curResPos] = 0;
	delete pWStr;
	return 1;
}

//将16进制字符转换成纯数字或英文
//要求: ComHexStr与AnsiStr定义的字符长度应相等
int SH_ConvertCompressedHexStr27BitAnsiStr( char *ComHexStr, char *AnsiStr)
{	
	int len,totalBit,curBitPos,curResBytePos,curBytePos;
	char buff,*pBuff;
	int i,j,k;

		char szTemp[400];
	memset(szTemp, 0x0, 400);
	strcpy(szTemp,ComHexStr);

	CString strTemp;


	int nLen = strlen(szTemp);
	ComHexStr[0] = 0;
	for (int l=0;l<nLen;l++)
	{			
		int nTemp = szTemp[l];
		if (szTemp[l] < 0)
		{
			nTemp +=256;
		}
		strTemp.Format("%x", nTemp/16);
		strcat(ComHexStr,strTemp);
		strTemp.Format("%x", nTemp%16);
		strcat(ComHexStr, strTemp);
	}
	
	len = strlen(ComHexStr);
	pBuff = new char[len+1];
	memset(pBuff,0,len+1);

	for(i=0,k=0;i<len;i+=2,k++) //将ASCII 码再转换成16进制数 
	{	for(j=0;j<2;j++)
		{	if( *(ComHexStr+i+j)>='0' && *(ComHexStr+i+j)<='9')
			{	if(j==0)
					pBuff[k] = (*(ComHexStr+i+j) - '0')<<4;
				else
					pBuff[k] |= (*(ComHexStr+i+j) - '0');
			}
			else if( *(ComHexStr+i+j)>='A' && *(ComHexStr+i+j)<='F')
			{	if(j==0)
					pBuff[k] = (*(ComHexStr+i+j) - 'A'+10)<<4;
				else
					pBuff[k] |= (*(ComHexStr+i+j) - 'A'+10);
			}
			else if( *(ComHexStr+i+j)>='a' && *(ComHexStr+i+j)<='f')
			{	if(j==0)
					pBuff[k] = (*(ComHexStr+i+j) - 'a'+10)<<4;
				else
					pBuff[k] |= (*(ComHexStr+i+j) - 'a'+10);
			}
			else
			{	return -1;
			}
		}
	}

	len = strlen(pBuff);
	totalBit = len*8;
	memset(AnsiStr,0,len+1);
	curBitPos=0;
	curResBytePos = 0;
	while(curBitPos<totalBit)
	{	if(totalBit-curBitPos<6) break;
		curBytePos = curBitPos/8;
		switch(curBitPos%8)
		{
		case 0:
			AnsiStr[curResBytePos] = pBuff[curBytePos] & 0x7F;
			break;
		case 1:
			AnsiStr[curResBytePos] = ((pBuff[curBytePos] & 0xFE)>>1)&0x7f;
			break;
		case 2:
			buff = pBuff[curBytePos] & 0xFC;
			buff = (buff>>2)&0x3f;
			buff += ((pBuff[curBytePos+1] &0x01)<<6);
			AnsiStr[curResBytePos] = buff;
			break;
		case 3:
			buff = pBuff[curBytePos] & 0xF8;
			buff = (buff>>3)&0x1f;
			buff += ((pBuff[curBytePos+1] &0x03)<<5);
			AnsiStr[curResBytePos] = buff;
			break;
		case 4:
			buff = pBuff[curBytePos] & 0xF0;
			buff = (buff>>4)&0x0f;
			buff += ((pBuff[curBytePos+1] &0x07)<<4);
			AnsiStr[curResBytePos] = buff;
			break;
		case 5:
			buff = pBuff[curBytePos] & 0xE0;
			buff = (buff>>5)&0x07;
			buff += ((pBuff[curBytePos+1] &0x0F)<<3);
			AnsiStr[curResBytePos] = buff;
			break;
		case 6:
			buff = pBuff[curBytePos] & 0xC0;
			buff = (buff>>6)&0x03;
			buff += ((pBuff[curBytePos+1] &0x1F)<<2);
			AnsiStr[curResBytePos] = buff;
			break;
		case 7:
			buff = pBuff[curBytePos] & 0x80;
			buff = (buff>>7)&0x01;
			buff += ((pBuff[curBytePos+1] &0x3F)<<1);
			AnsiStr[curResBytePos] = buff;
			break;	
		}	
		curBitPos += 7;
		curResBytePos++;
	}
	
	AnsiStr[curResBytePos] = 0;
	delete pBuff;
	return 1;
}

void CDemoDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	switch(nIDEvent)
	{
	case(1):
		{
			KillTimer(1);
			m_ctlbuttonsend.EnableWindow(TRUE);
			AfxMessageBox("发送信息失败",MB_OK+MB_ICONSTOP,0);
		}
	case(2):
		{
			KillTimer(2);
			if(receivenumber > 2)
			{
				if (receivebuffer[0] == char(0xaa))
				{
					switch(receivebuffer[1])
					{
					case(0x01):
						if (receivebuffer[2] == char(0x53) && receivebuffer[3] == char(0x65) && receivebuffer[4] == char(0x6e) && receivebuffer[5] == char(0x64) && receivebuffer[6] == char(0x20) && receivebuffer[7] == char(0x4f) && receivebuffer[8] == char(0x4b))
						{
							KillTimer(1);
							m_ctlbuttonsend.EnableWindow(TRUE);
							AfxMessageBox("发送信息成功!",MB_OK+MB_ICONINFORMATION,0);
							break;
						}
					else
						{
							KillTimer(1);
							m_ctlbuttonsend.EnableWindow(TRUE);
						    AfxMessageBox("发送信息失败!",MB_OK+MB_ICONSTOP,0);
							break;
						}
					case(0x04):
						{
							char strnumber[20];
							unsigned short int i,tmp;
							memset(&strnumber,0,sizeof(strnumber));
							for(i=1;i<=11;i++)
							strnumber[i-1] = receivebuffer[i+1];
							m_strreceive = m_strreceive+"来自"+strnumber+"的数据:";
							if(m_ctldisplaycombo.GetCurSel() == 0)	//以UNICODE显示
							{
								wchar_t strreceive[70];
								memset(&strreceive,0,sizeof(strreceive));
							/*	for(i=1;i<=receivebuffer[13]/2;i++)
								{
									tmp = receivebuffer[i*2+12];
									tmp = 0x100 * tmp;
									tmp += receivebuffer[i*2+13];                              
                                    strreceive[i-1] = wchar_t(tmp);
								}
								m_strreceive += strreceive;*/
								char szResult[200];
								memset(szResult, 0x0, 200);
								SH_ConvertCompressedHexStr27BitAnsiStr(receivebuffer+14,szResult);
								m_strreceive += szResult;

							}
							else									//以HEX显示
							{
								CString strtmp;
								for(i=1;i<=receivebuffer[13];i++)
								{
									BYTE bt=receivebuffer[i+13];
									strtmp.Format("%02X ",bt);
									m_strreceive +=  strtmp;
								}

							}
							m_strreceive = m_strreceive+char(13)+char(10);
							UpdateData(FALSE);
						}
											case(0x03):
						{
							char strnumber[20];
							unsigned short int i,tmp;
							memset(&strnumber,0,sizeof(strnumber));
							for(i=1;i<=11;i++)
							strnumber[i-1] = receivebuffer[i+1];
							m_strreceive = m_strreceive+"来自"+strnumber+"的数据:";
							if(m_ctldisplaycombo.GetCurSel() == 0)	//以UNICODE显示
							{
								wchar_t strreceive[70];
								memset(&strreceive,0,sizeof(strreceive));
							/*	for(i=1;i<=receivebuffer[13]/2;i++)
								{
									tmp = receivebuffer[i*2+12];
									tmp = 0x100 * tmp;
									tmp += receivebuffer[i*2+13];                              
                                    strreceive[i-1] = wchar_t(tmp);
								}
								m_strreceive += strreceive;*/
								char szResult[200];
								memset(szResult, 0x0, 200);
								SH_ConvertUnicodeHexStr2AnsiStr(receivebuffer+14,szResult);
								m_strreceive += szResult;

							}
							else									//以HEX显示
							{
								CString strtmp;
								for(i=1;i<=receivebuffer[13];i++)
								{
									BYTE bt=receivebuffer[i+13];
									strtmp.Format("%02X ",bt);
									m_strreceive +=  strtmp;
								}

							}
							m_strreceive = m_strreceive+char(13)+char(10);
							UpdateData(FALSE);
						}
					}
				}
			}
			receivenumber = 0;
			memset(&receivebuffer,0,sizeof(receivenumber));
		}
	default:
		CDialog::OnTimer(nIDEvent);
	}
}

LONG CDemoDlg::OnCommunication(WPARAM ch, LPARAM port)
{
	//接收到数据
	KillTimer(2);
	SetTimer(2,200,NULL);
	receivebuffer[receivenumber] = ch;
	receivenumber++;
	return 0;
}

⌨️ 快捷键说明

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