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