?? comtestdlg.cpp
字號(hào):
// ComTestDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ComTest.h"
#include "ComTestDlg.h"
#include "mcom.h"
#include "Config.h"
#include <math.h>
#include "DlgCal.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define TIMER_SENDDATA_BASE 100
#define TIMER_START 1000
CSerialPort* m_Ports[4];
_PortInfo PortInfo[4];
void CALLBACK COM_CALLBACK(HWND hWnd,UINT nEvent,UINT uPort,BYTE Data);
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CComTestDlg dialog
CComTestDlg::CComTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CComTestDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CComTestDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
for(int i=0;i<4;i++) m_rec[i] = _T("");
for(i=0;i<4;i++){
PortInfo[i].bReciveFile =FALSE;
PortInfo[i].bSendFile =FALSE;
PortInfo[i].iReciveType =1;
PortInfo[i].iSendType =1;
PortInfo[i].stReciveFileName ="";
PortInfo[i].stSendFileName ="";
PortInfo[i].bSendLine =TRUE;
PortInfo[i].bHaveCR =FALSE;
PortInfo[i].nUseTime =0;
hReciveFile[i]=NULL;
// ifReadFile[i]=NULL;
m_send[i] = _T("");
m_Ports[i]=0;
m_writeinfo[i]= _T("");
m_rec[0]=_T("");
}
}
CComTestDlg::~CComTestDlg()
{
for(int i=0;i<4;i++){
if(hReciveFile[i]) CloseHandle(hReciveFile[i]);
if(ifReadFile[i].is_open()) ifReadFile[i].close();
if(m_Ports[i]) delete m_Ports[i];
}
}
void CComTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CComTestDlg)
//}}AFX_DATA_MAP
DDX_Text(pDX, IDC_REC1, m_rec[0]);
DDX_Text(pDX, IDC_REC2, m_rec[1]);
DDX_Text(pDX, IDC_REC3, m_rec[2]);
DDX_Text(pDX, IDC_REC4, m_rec[3]);
DDX_Text(pDX, IDC_SEND1, m_send[0]);
DDX_Text(pDX, IDC_SEND2, m_send[1]);
DDX_Text(pDX, IDC_SEND3, m_send[2]);
DDX_Text(pDX, IDC_SEND4, m_send[3]);
DDX_Text(pDX, IDC_WRITETITLE1, m_writeinfo[0]);
DDX_Text(pDX, IDC_WRITETITLE2, m_writeinfo[1]);
DDX_Text(pDX, IDC_WRITETITLE3, m_writeinfo[2]);
DDX_Text(pDX, IDC_WRITETITLE4, m_writeinfo[3]);
}
BEGIN_MESSAGE_MAP(CComTestDlg, CDialog)
//{{AFX_MSG_MAP(CComTestDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CALCULATE_PARTY, OnCalculateParty)
ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(IDC_CONFIG1,IDC_CONFIG4,OnConfig)
ON_COMMAND_RANGE(IDC_CLEAR1,IDC_CLEAR4,OnClear)
ON_COMMAND_RANGE(IDC_WRITE1,IDC_WRITE4,OnSend)
ON_COMMAND_RANGE(IDC_ST1,IDC_ST4,OnST)
ON_COMMAND_RANGE(IDC_WRITEFILE1,IDC_WRITEFILE4,OnWriteInfo)
// ON_CONTROL_RANGE(EN_KILLFOCUS,IDC_WRITETITLE1,IDC_SEND4,OnKillfocus)
// ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)
// ON_MESSAGE(WM_COMM_CTS_DETECTED, OnCTSDetected)
END_MESSAGE_MAP()
/*
BEGIN_EVENTSINK_MAP(CZYConfigView, CFormView)
//{{AFX_EVENTSINK_MAP(CZYConfigView)
//}}AFX_EVENTSINK_MAP
ON_EVENT_RANGE(CZYConfigView,IDC_MSFINPUT,IDC_MSFALARM,-600,OnClickMsf, VTS_I4)
ON_EVENT_RANGE(CZYConfigView,IDC_MSFINPUT,IDC_MSFALARM,-601,OnDblClickMsf, VTS_I4)
ON_EVENT_RANGE(CZYConfigView,IDC_MSFINPUT,IDC_MSFALARM,-603,OnKeyPressMsf, VTS_I4 VTS_PI2)
END_EVENTSINK_MAP()
*/
/////////////////////////////////////////////////////////////////////////////
// CComTestDlg message handlers
BOOL CComTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 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
SetTimer(TIMER_START,500,NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CComTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 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 CComTestDlg::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 CComTestDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CComTestDlg::OnClear(UINT uid)
{
GetDlgItem(uid-IDC_CLEAR1+IDC_REC1)->SetWindowText("");
UpdateData();
}
void CComTestDlg::OnConfig(UINT uid)
{
int id=uid-IDC_CONFIG1;
CConfig* dlg = new CConfig(this,id);
if(dlg->DoModal()==IDOK){
if(PortInfo[id].bReciveFile){
if(hReciveFile[id]) CloseHandle(hReciveFile[id]);
hReciveFile[id]= CreateFile(PortInfo[id].stReciveFileName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
SetFilePointer(hReciveFile[id],0,0,FILE_END);//指針移到文件尾
}
if(PortInfo[id].bSendFile){
if(ifReadFile[id].is_open()) ifReadFile[id].close();
ifReadFile[id].open(PortInfo[id].stSendFileName);
}
//OnST(id+IDC_ST1);
}
delete dlg;
}
void CComTestDlg::OnST(UINT uid)
{
int id=uid-IDC_ST1;
BOOL sb=FALSE;
if(m_Ports[id]){//停止
KillTimer(TIMER_SENDDATA_BASE+id);
delete m_Ports[id];
m_Ports[id]=NULL;
SetDlgItemText(IDC_WORK1+id,"停止通訊");
SetDlgItemText(uid,"開(kāi)始");
}else{//開(kāi)始
m_Ports[id]=new CSerialPort;
if (m_Ports[id]->InitPort(m_hWnd,
COM_CALLBACK,
id + 1,
PortInfo[id].Baud,
PortInfo[id].nBufferSize,
PortInfo[id].Parity,
PortInfo[id].DataBits,
PortInfo[id].StopsBits,
PortInfo[id].dwCommEvents)){
m_Ports[id]->StartMonitoring();
SetDlgItemText(IDC_WORK1+id,"正在通訊");
SetDlgItemText(uid,"停止");
sb=TRUE;
if(PortInfo[id].nUseTime!=0) SetTimer(TIMER_SENDDATA_BASE+id,PortInfo[id].nUseTime,NULL);
}else{//端口不能用
delete m_Ports[id];
m_Ports[id]=NULL;
SetDlgItemText(IDC_WORK1+id,"找不到端口");
SetDlgItemText(IDC_ST1+id,"開(kāi)始");
}
}
GetDlgItem(IDC_CONFIG1+id)->EnableWindow(sb);
GetDlgItem(IDC_REC1+id)->EnableWindow(sb);
GetDlgItem(IDC_CLEAR1+id)->EnableWindow(sb);
GetDlgItem(IDC_SEND1+id)->EnableWindow(sb);
GetDlgItem(IDC_WRITE1+id)->EnableWindow(sb);
GetDlgItem(IDC_WRITETITLE1+id)->EnableWindow(sb);
GetDlgItem(IDC_WRITEFILE1+id)->EnableWindow(sb);
GetDlgItem(IDC_CONFIG1+id)->EnableWindow(!sb);
}
void CComTestDlg::OnSend(UINT uid)
{
UpdateData();
char buf[1024];
char buf1[255];
char CR[]={13,10,0};
int id=uid-IDC_WRITE1;
UINT line=GetDlgItemInt(IDC_DISSTATE1+id);
if(m_send[id]!=""){//從框中發(fā)送
CEdit* p=(CEdit*) GetDlgItem(id+IDC_SEND1);
if(PortInfo[id].bSendLine){//一行一行發(fā)送
int i=p->GetLineCount();
if(line>=UINT(i)) line=0;
memset(buf,1,1024);
int j=p->GetLine(line,buf);
buf[j]=0;
if(PortInfo[id].bHaveCR && PortInfo[id].iSendType==0) strcat(buf,CR);//含有CR
}else{//整個(gè)發(fā)送
p->GetWindowText(buf,1024);
if(PortInfo[id].bHaveCR && PortInfo[id].iSendType==0) strcat(buf,CR);//含有CR
}
}
else{//從文件中發(fā)送
if(!PortInfo[id].bSendFile) return;
if(!ifReadFile[id]){
if(AfxMessageBox("文件已讀完,你要從頭開(kāi)始嗎?",MB_YESNO)!=IDYES) return;
line=0;
if(ifReadFile[id].is_open()) ifReadFile[id].close();
ifReadFile[id].open(PortInfo[id].stSendFileName);
}
if(PortInfo[id].bSendLine ){//一行一行發(fā)送
ifReadFile[id].getline(buf,255);
if(PortInfo[id].bHaveCR && PortInfo[id].iSendType==0) strcat(buf,CR);//含有CR
}else {//整個(gè)發(fā)送
strcpy(buf,"");
while(ifReadFile[id].getline(buf1,255)){
strcat(buf,buf1);
//作為一個(gè)文件整體發(fā)出,應(yīng)包含CR
if(PortInfo[id].iSendType==0) strcat(buf,CR);//含有CR
else strcat(buf," ");
}
}
}
if(PortInfo[id].bReciveFile && hReciveFile){
sprintf(buf1,"%s發(fā)送:",CR);
//寫(xiě)入文件
DWORD wb=0;
WriteFile(hReciveFile[id],buf1,strlen(buf1),&wb,NULL);
WriteFile(hReciveFile[id],buf,strlen(buf),&wb,NULL);
}
int len=0;
switch (PortInfo[id].iSendType){
case 0:
len=strlen(buf);
break;
case 1://轉(zhuǎn)化為十六進(jìn)制
len=ToHex(buf);
break;
}
if(len>0) m_Ports[id]->WriteToPort(buf,len);
if(PortInfo[id].bSendLine) line++;
SetDlgItemInt(IDC_DISSTATE1+id,line);
}
/*********************************************************************
* 函數(shù)名稱:CComTestDlg::ToHex
* 說(shuō)明:將字串化為16進(jìn)制
* 入口參數(shù):
* char *buf --
* 返回值:
* int --
* 作者: 張勇
* 時(shí)間 : 2001-09-21 11:09:09
*********************************************************************/
int CComTestDlg::ToHex(char *buf)
{
int len=0;
int p1=0,p2=1;
int i,j;
char buf1[5];
int slen=strlen(buf);
_strupr(buf);//化為大寫(xiě)
while(TRUE){
while(p1<slen &&(!isxdigit(buf[p1]))) p1++;
p2=p1+1;
while(p2<slen &&(isxdigit(buf[p2]))) p2++;
if(p2<slen) buf[p2]=0;
if(p1<slen){
strcpy(buf1,buf+p1);
i=strlen(buf1);
if(i>2){
AfxMessageBox("輸入的十六進(jìn)制數(shù)有問(wèn)題");
return 0;
}
buf[len]=0;
i--;
for(j=i;j>-1;j--){
if(buf1[j]<='9') buf[len]+=(buf1[j]-'0')*(int)(pow(16,i-j));
else buf[len]+=(buf1[j]-'A'+10)*(int)pow(16,i-j);
}
len++;
}
if(p2>=slen) break;
p1=p2+1;
}
return len;
}
void CComTestDlg::OnWriteInfo(UINT uid)
{
int id=uid-IDC_WRITEFILE1;
UpdateData();
DWORD wb=0;
if(PortInfo[id].bReciveFile && hReciveFile){
char buf[3];
buf[0]=13;
buf[1]=10;
WriteFile(hReciveFile[id],buf,2,&wb,NULL);
WriteFile(hReciveFile[id],m_writeinfo[id],m_writeinfo[id].GetLength(),&wb,NULL);
}
}
void CComTestDlg::OnCalculateParty()
{
CDlgCal* pDlg=new CDlgCal(this);
pDlg->Create(IDD_CALCULATE_PARTY,this);
pDlg->ShowWindow(SW_SHOW);
}
void CComTestDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent>=TIMER_SENDDATA_BASE && nIDEvent<TIMER_SENDDATA_BASE+4){
UINT id=nIDEvent-TIMER_SENDDATA_BASE;
OnSend(id+IDC_WRITE1);
CDialog::OnTimer(nIDEvent);
return;
}
switch(nIDEvent){
case TIMER_START:{
//初始化端口
for (int i = 0; i < 4; i++) {
m_Ports[i]=new CSerialPort;
PortInfo[i].Baud=9600;//波特率
PortInfo[i].Parity='N';//校驗(yàn)位
PortInfo[i].DataBits=8;//數(shù)據(jù)位
strcpy(PortInfo[i].StopsBits,"1");//停頓位1,1。5,2
PortInfo[i].dwCommEvents=EV_RXCHAR | EV_CTS;//事件
PortInfo[i].nBufferSize=512;//發(fā)送緩沖區(qū)大小;
if (m_Ports[i]->InitPort(m_hWnd,COM_CALLBACK, i + 1, 9600)){
m_Ports[i]->StartMonitoring();
SetDlgItemText(IDC_WORK1+i,"正在通訊");
GetDlgItem(IDC_CONFIG1+i)->EnableWindow(FALSE);//正在通訊時(shí)配置不可用
}else{//端口不能用
delete m_Ports[i];
m_Ports[i]=NULL;
SetDlgItemText(IDC_WORK1+i,"找不到端口");
SetDlgItemText(IDC_ST1+i,"開(kāi)始");
GetDlgItem(IDC_CONFIG1+i)->EnableWindow(FALSE);
GetDlgItem(IDC_REC1+i)->EnableWindow(FALSE);
GetDlgItem(IDC_CLEAR1+i)->EnableWindow(FALSE);
GetDlgItem(IDC_SEND1+i)->EnableWindow(FALSE);
GetDlgItem(IDC_WRITE1+i)->EnableWindow(FALSE);
GetDlgItem(IDC_WRITETITLE1+i)->EnableWindow(FALSE);
GetDlgItem(IDC_WRITEFILE1+i)->EnableWindow(FALSE);
}
}
KillTimer(TIMER_START);
break;}
}
CDialog::OnTimer(nIDEvent);
}
//回調(diào)
void CALLBACK COM_CALLBACK(HWND hWnd,UINT nEvent,UINT uPort,BYTE Data)
{
CWnd* pWnd=CWnd::FromHandle(hWnd);
((CComTestDlg*)pWnd)->GetData(nEvent,uPort,Data);
}
void CComTestDlg::GetData(UINT nEvent, UINT uPort, BYTE Data)
{
if (uPort <= 0 || uPort > 4) return ;
UINT id=uPort-1;
switch(nEvent){
case COMM_RXCHAR:{//收到字
BYTE buf[4];
BYTE buf1[3];
switch (PortInfo[id].iReciveType){
case 0:{
buf[0]=Data;
buf[1]=0;
break;}
case 1:{
buf[0]=' ';
buf[1]=0;
itoa(Data,(char*)buf1,16);
if(_mbslen(buf1)==1){
buf[1]='0';
buf[2]=0;
}
_mbscat(buf,buf1);
break;}
}
m_rec[id]+=buf;
//寫(xiě)入文件
DWORD wb=0;
if(PortInfo[id].bReciveFile && hReciveFile) WriteFile(hReciveFile[id],buf,_mbslen(buf),&wb,NULL);
break;}
case COMM_CTS_DETECTED:{//收到結(jié)束信號(hào)
char buf[16];
buf[0]=13;
buf[1]=10;
buf[2]=0;
strcat(buf+2,"接收:");
m_rec[id]+=buf;
//寫(xiě)入文件
DWORD wb=0;
if(PortInfo[id].bReciveFile && hReciveFile) WriteFile(hReciveFile[id],buf,strlen(buf),&wb,NULL);
break;}
}
UpdateData(FALSE);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -