📄 conmunication.cpp
字号:
// Conmunication.cpp : implementation file
//
#include "stdafx.h"
#include "inf of com.h"
#include "Conmunication.h"
#include "afxmt.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CConmunication dialog
CConmunication::CConmunication(CWnd* pParent /*=NULL*/)
: CDialog(CConmunication::IDD, pParent)
{
//{{AFX_DATA_INIT(CConmunication)
m_ShowSend = _T("");
m_ShowReceive = _T("");
//}}AFX_DATA_INIT
hWnd=NULL;
times=1;
buf=NULL;
bLock1=FALSE;
bLock12=FALSE;
bLock123=FALSE;
bVerify=FALSE;
bVerifyData=FALSE;
bThread=TRUE;
}
CConmunication::~CConmunication()
{
delete buf;
}
void CConmunication::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CConmunication)
DDX_Control(pDX, IDC_BUTTON_Send, m_Send);
DDX_Control(pDX, IDC_BUTTON_Clr, m_Clear);
DDX_Control(pDX, IDC_BUTTON_Close, m_Close);
DDX_Control(pDX, IDC_STATIC_ShowLabel, m_Label);
DDX_Control(pDX, IDC_EDIT_ShowSend, m_ConEdit);
DDX_Control(pDX, IDC_PROGRESS1, m_Progress);
DDX_Text(pDX, IDC_EDIT_ShowSend, m_ShowSend);
DDX_Text(pDX, IDC_EDIT_ShowReceive, m_ShowReceive);
DDX_Control(pDX, IDC_MSCOMM1, m_MsComm);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CConmunication, CDialog)
//{{AFX_MSG_MAP(CConmunication)
ON_BN_CLICKED(IDC_BUTTON_Send, OnBUTTONSend)
ON_BN_CLICKED(IDC_BUTTON_Clr, OnBUTTONClr)
ON_BN_CLICKED(IDC_BUTTON_Close, OnBUTTONClose)
ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
ON_NOTIFY(NM_OUTOFMEMORY, IDC_PROGRESS1, OnOutofmemoryProgress1)
ON_MESSAGE(WM_CONMUNICATION,ReadData)
ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
ON_BN_CLICKED(IDC_RADIO5, OnRadio5)
ON_BN_CLICKED(IDC_RADIO6, OnRadio6)
ON_BN_CLICKED(IDC_RADIO7, OnRadio7)
ON_BN_CLICKED(IDC_RADIO8, OnRadio8)
ON_BN_CLICKED(IDC_RADIO9, OnRadio9)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CConmunication message handlers
void CConmunication::OnCancel()
{
// TODO: Add extra cleanup here
//CDialog::OnCancel();
}
void CConmunication::OnOK()
{
// TODO: Add extra validation here
// CDialog::OnOK();
}
CEvent ThreadBegin;
CEvent ThreadEnd;
BOOL bReady;
BOOL bFile;
BOOL bHand;
CConmunication op;
int size;
BOOL bSending=FALSE;
CFile file;
CString str;
long len;
UINT ThreadProc(LPVOID param)
{
// long len;
::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE);
// BOOL KeepRunning=true;
/*
VARIANT variant_inp;
BYTE rxdata[2048];
long k;
COleSafeArray safearray_inp;
variant_inp=op.m_MsComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
long len1=0;
while(len1<len-1)
{
// str.Format("%c",rxdata[len1]);
//op.m_ShowReceive+=str;
//op.UpdateData(FALSE);
//op.m_Progress.SetPos(len1*600);
str.Format("%d",len1);
::PostMessage((HWND)param,WM_UPDATE,0,(LPARAM)(LPCTSTR)str);
Sleep(600);
len1++;
}*/
// if(AfxMessageBox("通信成功!继续发送吗?")==MB_OK)
/* while(KeepRunning)
{
if(op.bSending)
{
len=op.m_MsComm.GetOutBufferCount();
if(len=size+2)
ThreadEnd.SetEvent();
if(len==0)
AfxMessageBox("OK!");
}
else
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not si gned.
CString strtemp;
variant_inp=op.m_MsComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
if(bFile)
{
if(len<size+2)
{
for(k=0;k<size;k++)
if( op.bindata[k]==rxdata[k])
{
op.m_Progress.SetPos(k+16*op.times);
Sleep(700);
}
else
{
if(AfxMessageBox("校验失败!重新发送吗?",MB_OK)==MB_OK)
{
op.ReSend=TRUE;
op.m_MsComm.SetRThreshold(1);
op.m_MsComm.SetSThreshold(0);
CByteArray reArr;
op.bVerify=FALSE;
if(reArr.GetSize()!=0)
reArr.RemoveAll();
reArr.Add(0x06); //给数组赋值
COleVariant varOut;
varOut=COleVariant(reArr); //将数据转换为变体数据类型
op.m_MsComm.SetOutput (varOut);
op.m_Progress.SetPos(16*op.times);
}
break;
ThreadEnd.SetEvent();
}//循环
ThreadEnd.SetEvent();//一帧数据检验完成
}//len<size+_2
op.UpdateData(FALSE);
}//bfile
CString str;
if(!bHand && !bFile)
for(l=0;l<size;l++)
{
op.m_ShowReceive="接受的字符:";
str.Format("%c",rxdata[l]);
op.m_ShowReceive+=str;
Sleep(500);
}
ThreadEnd.SetEvent();
}//接受数据*/
/* Result=::WaitForSingleObject(ThreadEnd.m_hObject,0);
if (Result==WAIT_OBJECT_0)
KeepRunning=false;
else
Sleep(1000);
}*/
// ::PostMessage((HWND)param,WM_CONMUNICATION,0,0);
return 0;
}
void CConmunication::OnBUTTONSend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
bSending=TRUE;
if(bFile || bHand)
{
if(!bFile && bSending)
{
size=0;
if(m_ShowSend!="")
{
if(bytOutArr.GetSize()!=0)
bytOutArr.RemoveAll();
bytOutArr.Add(0xFF);
m_MsComm.SetOutput(COleVariant(m_ShowSend));
varOut=COleVariant(bytOutArr); //将数据转换为变体数据类型
// m_MsComm.SetOutput(COleVariant(str));
hWnd=GetSafeHwnd();
// AfxBeginThread(ThreadProc,NULL);
// ThreadBegin.SetEvent();
}
else
AfxMessageBox(" 请填写发送内容!");
}
else
{
if(bytOutArr.GetSize()!=0)
bytOutArr.RemoveAll();
for(int i=0;i<sizeof(bindata);i++)
bytOutArr.Add(bindata[i]); //给数组赋值
bytOutArr.Add(0xFF);
bytOutArr.Add(0xFF);//数据以4个F为结束标识
varOut=COleVariant(bytOutArr); //将数据转换为变体数据类型
hWnd=GetSafeHwnd();
bSending=TRUE;
m_MsComm.SetOutput(varOut);
AfxBeginThread(ThreadProc,hWnd);
ThreadBegin.SetEvent();
}
m_MsComm.SetOutput(varOut);
// }
// else
// AfxMessageBox(" 正在准备线路!");
}
else
{
AfxMessageBox("请选择发送方式!");
}
/* UpdateData(TRUE);
size=0;
if(m_ShowSend!="")
{
m_MsComm.SetOutput(COleVariant(m_ShowSend));
m_ShowReceive="正在通信中....";
UpdateData(FALSE); /*
}*/
}
void CConmunication::ReadData()
{
if(bFile || bHand)
{
if(!ReSend)
{
if(bFile)
size=file.Read(bindata,sizeof(bindata));
else
{
if(bytOutArr.GetSize()!=0)
bytOutArr.RemoveAll();
int j;
size=0;
for(j=times*16;j<((times+1)*16) && j<m_ShowSend.GetLength();j++)
{
bytOutArr.Add(buf[j]);
size++;
}
}
times++;
bytOutArr.Add(0xFF);
bytOutArr.Add(0xFF);
}
ReSend=FALSE;
if(size==0)
{
m_ShowSend="";
UpdateData(FALSE);
if(MessageBox("通信成功!继续发送吗?","成功提示",MB_OK|MB_ICONINFORMATION)==MB_OK)
{
m_MsComm.SetRThreshold(1);
m_MsComm.SetSThreshold(0);
CByteArray reArr;
bVerify=FALSE;
bFile=FALSE;
bHand=FALSE;
// BYTE Byte=0x06;//准备发送
reArr.Add(ControlByte); //给数组赋值
COleVariant varOut;
if(reArr.GetSize()!=0)
reArr.RemoveAll();
varOut=COleVariant(reArr); //将数据转换为变体数据类型
m_MsComm.SetOutput (varOut);
}
}
else
{
if(bFile)
{
m_MsComm.SetSThreshold(0);
CByteArray reArr;
if(reArr.GetSize()!=0)
reArr.RemoveAll();
BYTE Byte=0x0A;//准备校验
reArr.Add(Byte); //给数组赋值
COleVariant varOut;
varOut=COleVariant(reArr); //将数据转换为变体数据类型
m_MsComm.SetOutput (varOut);
}
else
{
varOut=COleVariant(bytOutArr); //将数据转换为变体数据类型
hWnd=GetSafeHwnd();
bSending=TRUE;
m_MsComm.SetOutput(varOut);
AfxBeginThread(ThreadProc,hWnd);
ThreadBegin.SetEvent();
}
}
}
else
{
m_MsComm.SetRThreshold(18);
m_MsComm.SetSThreshold(0);
}
}
void CConmunication::OnBUTTONClr()
{
// TODO: Add your control notification handler code here
m_ShowSend="";
UpdateData(FALSE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -