📄 cmychatdlg.cpp
字号:
m_cOutput.SetWindowText(m_strOutput);
m_cOutput.SetFocus();
UpdateData(FALSE);
// TODO: Add your control notification handler code here
}
void CCmyChatDlg::OnButtonClearrecieve()
{
m_strInput=_T("");
m_cInput.SetWindowText(m_strInput);
UpdateData(FALSE);
m_cOutput.SetFocus();//设置焦点
// TODO: Add your control notification handler code here
}
void CCmyChatDlg::SocketReset()
{
if(m_arIn!=NULL)
{
delete m_arIn;
m_arIn=NULL;
}
if(m_arOut!=NULL)
{
delete m_arOut;
m_arOut=NULL;
}
if(m_file!=NULL)
{
delete m_file;
m_file=NULL;
}
if(m_ClientSocket!=NULL)
{
delete m_ClientSocket;
m_ClientSocket=NULL;
}
if(m_ServerSocket!=NULL)
{
delete m_ServerSocket;
m_ServerSocket=NULL;
}
m_strConnect="";
UpdateData(FALSE);
}
void CCmyChatDlg::OnClose()//当对方退出时,断开连接
{
if(m_ClientSocket->m_nStatus==0)
m_strConnect="客户";
else
m_strConnect="服务器";
m_strConnect+="已断开!";
UpdateData(FALSE);
}
void CCmyChatDlg::OnAccept()//连接请求
{
m_strConnect+="连接成功!";
UpdateData(FALSE);
m_strConnect="";
m_ClientSocket=new CNewSocket;
m_ClientSocket->GetDlg(this);
m_ServerSocket->Accept(*m_ClientSocket);
m_ClientSocket->m_nStatus=m_ServerSocket->m_nStatus;
m_file=new CSocketFile(m_ClientSocket);
m_arIn=new CArchive(m_file,CArchive::load);
m_arOut=new CArchive(m_file,CArchive::store);
}
void CCmyChatDlg::OnReceive() //接收数据
{
*m_arIn>>m_strInput;
CString m_strInText;
m_cInput.GetWindowText(m_strInText);
m_strInput+=0x0d; //加回车
m_strInput+=0x0a; //加换行
m_strInput+=m_strInText;
// MessageBox(m_strInText,"InText",MB_OK);
// MessageBox(m_strInput,"Input",MB_OK);
UpdateData(FALSE);
}
BEGIN_EVENTSINK_MAP(CCmyChatDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CCmyChatDlg)
ON_EVENT(CCmyChatDlg, IDC_MSCOMM1, 1 /* OnComm */, OnMscomm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CCmyChatDlg::OnMscomm()
{
// TODO: Add your control notification handler code here
// 有16进制转换
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_cComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_cComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
if(m_cComHexRecieve.GetCheck())
strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
else
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strComInput+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
/* 没有16进制转换
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_cComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_cComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strComInput+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
*/
/*
另一个程序
VARIANT m_Input1;
COleSafeArray m_Input2;
long length,i;
BYTE data[1024];
CString str;
if(m_Comm.GetCommEvent()==2)//接收缓冲区内有字符
{
m_Input1=m_Comm.GetInput();//读取缓冲区内的数据
m_Input2=m_Input1;//将VARIANT型变量转换为COleSafeArray型变量
length=m_Input2.GetOneDimSize();//确定数据长度
for(i=0;i<length;i++)
m_Input2.GetElement(&i,data+i);//将数据转换为BYTE型数组
for(i=0;i<length;i++)//将数组转换为CString型变量
{
char a=*(char*)(data+i);
str.Format("%c",a);
m_ReceiveData+=str;
}
*/
}
void CCmyChatDlg::OnButtonReg()
{
m_strOutput.TrimLeft(" ");
if(m_nStatus==0)
{
// if(m_strConnect=="正在等待客户端连接......连接成功!")
// {
// MessageBox(m_strConnect+" 可以REG了",NULL,MB_OK);
// OnButtonSend();
UpdateData(TRUE);
CString m_strReg;
m_strReg="\x47\x50\x52\x53";//GPRS
m_strReg+="\x30\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39";//00123456789
m_strReg+="\x00\x15";//长度为21字节
m_strReg+="\x72\x65\x67";//REG
*m_arOut<<m_strReg;
m_arOut->Flush();
m_strReg="";
// }
}
m_cOutput.SetFocus();
// TODO: Add your control notification handler code here
}
BOOL CCmyChatDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
{
CWnd* v_wCtrl=GetFocus(); //获得焦点
if (v_wCtrl==&m_cCancel) //列表窗回车
{
OnOK();
return true;
}
if (v_wCtrl==&m_cConnect)
{
OnButtonConnect();
return true;
}
if (v_wCtrl==&m_cDisconnect)
{
OnButtonDisconnect();
return true;
}
if (v_wCtrl==&m_cSend)
{
OnButtonSend();
return true;
}
if (v_wCtrl==&m_cClear)
{
OnButtonClearsend();
return true;
}
if (v_wCtrl==&m_cClearRecieve)
{
OnButtonClearrecieve();
return true;
}
if (v_wCtrl==&m_cComSend)
{
OnButtonComSend();
return true;
}
if (v_wCtrl==&m_cComClearSend)
{
OnButtonComClearsend();
return true;
}
if (v_wCtrl==&m_cComClearRecieve)
{
OnButtonComClearrecieve();
return true;
}
if (v_wCtrl==&m_cOutput)
{
return false;
}
if (v_wCtrl==&m_cComOutput)
{
return false;
}
CDialog* Pwnd=(CDialog*)GetActiveWindow(); //取得对话框指针
Pwnd->NextDlgCtrl(); //切换到下一个输入焦点
return true;
}
return CDialog::PreTranslateMessage(pMsg);
}
void CCmyChatDlg::OnButtonHeart()
{
m_strOutput.TrimLeft(" ");
if(m_nStatus==0)
{
// if(m_strConnect=="正在等待客户端连接......连接成功!")
// {
// MessageBox(m_strConnect+" 可以REG了",NULL,MB_OK);
// OnButtonSend();
UpdateData(TRUE);
/* m_strOutput="GPRS00123456789";//GPRSID
m_strOutput+=0x00;
m_strOutput+=0x14; //GPRSID+"0x00 0x14"+"HEART;"长度为20字节
m_strOutput+="HEART;";
*m_arOut<<m_strOutput;
m_arOut->Flush();
m_strOutput="";
*/ CString m_strHeart;
m_strHeart="\x47\x50\x52\x53";
m_strHeart+="\x30\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39";
m_strHeart+="\x00\x17";
m_strHeart+="\x48\x45\x41\x52\x54\x3B";
*m_arOut<<m_strHeart;
m_arOut->Flush();
m_strHeart="";
// }
}
m_cOutput.SetFocus();
// TODO: Add your control notification handler code here
}
void CCmyChatDlg::OnButtonComSend()
{
UpdateData(TRUE);//读取编辑框内容
if(m_strComOutput.IsEmpty())
{
MessageBox("请输入要发送的信息!","信息提示",MB_OK);
return;
}
else if(!m_cComm.GetPortOpen())
{
MessageBox("串口未打开,请先打开!","信息提示",MB_OK);
// OnButtonComopen(); //打开串口,并初始化串口
// m_cComm.SetPortOpen(TRUE);
// m_cComm.SetDTREnable(TRUE);
}
// else
if(m_cComHexSend.GetCheck())
{
CByteArray hexdata;
int len=String2Hex(m_strComOutput,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
m_cComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据
}
else
m_cComm.SetOutput(COleVariant(m_strComOutput));//发送ASCII字符数据
m_cComOutput.SetFocus();
// TODO: Add your control notification handler code here
}
void CCmyChatDlg::OnButtonComClearsend()
{
m_strComOutput=_T("");
m_cComOutput.SetWindowText(m_strComOutput);
UpdateData(FALSE);
m_cComOutput.SetFocus();
// TODO: Add your control notification handler code here
}
void CCmyChatDlg::OnButtonComClearrecieve()
{
m_strComInput=_T("");
m_cComInput.SetWindowText(m_strComInput);
UpdateData(FALSE);
m_cComOutput.SetFocus();//设置焦点
// TODO: Add your control notification handler code here
}
//发送16进制数,转换成ASCII码
int CCmyChatDlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2); //16进制数换算成ASCII码,数组大小
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata; //16进制数换算成ASCII码,如3,1==49
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
char CCmyChatDlg::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30; //如ch='3'返回3
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10; //如ch='B'返回11
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10; //如ch='b'返回11
else return (-1);
}
void CCmyChatDlg::OnButtonComset()
{
// TODO: Add your control notification handler code here
}
void CCmyChatDlg::OnButtonComopen()
{
// TODO: Add your control notification handler code here
//初始化串口
if(m_cComm.GetPortOpen())
m_cComm.SetPortOpen(FALSE);
m_cComm.SetCommPort(1); //选择com1
if( !m_cComm.GetPortOpen())
{
m_cComm.SetPortOpen(TRUE);//打开串口
m_cComm.SetDTREnable(TRUE);
}
else
AfxMessageBox("cannot open serial port,不能打开串口!");
m_cComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
m_cComm.SetInputMode(1); //1:表示以二进制方式检取数据
m_cComm.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_cComm.SetInputLen(0); //设置当前接收区数据长度为0
m_cComm.GetInput();//先预读缓冲区以清除残留数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -