📄 apicomdlg.cpp
字号:
// apicomDlg.cpp : implementation file
//
#include "stdafx.h"
#include "apicom.h"
#include "apicomDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
HANDLE hCom;
char buf[100];
unsigned char msg1[100];
OVERLAPPED m_OverlappedRead, m_OverlappedWrite;
int butong=-1,tong=0;
/////////////////////////////////////////////////////////////////////////////
// CApicomDlg dialog
CApicomDlg::CApicomDlg(CWnd* pParent /*=NULL*/)
: CDialog(CApicomDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CApicomDlg)
m_baudrate = 9600;
m_checkout = 1;
m_comsel = 0;
m_databit = 8;
m_parity = 0;
m_readdata = _T("");
m_rsmode = 0;
m_rtime = 2;
m_senddata = _T("@01RD");
m_stime = 50;
m_stopbit = 0;
m_data = 0.0f;
m_data2 = 0.0f;
m_data3 = 0.0f;
m_data4 = 0.0f;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CApicomDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CApicomDlg)
DDX_Text(pDX, IDC_baudrat, m_baudrate);
DDV_MinMaxInt(pDX, m_baudrate, 2400, 115200);
DDX_CBIndex(pDX, IDC_checkout, m_checkout);
DDX_CBIndex(pDX, IDC_comsel, m_comsel);
DDX_Text(pDX, IDC_databit, m_databit);
DDV_MinMaxInt(pDX, m_databit, 7, 8);
DDX_CBIndex(pDX, IDC_parity, m_parity);
DDX_Text(pDX, IDC_readdata, m_readdata);
DDX_CBIndex(pDX, IDC_rsmode, m_rsmode);
DDX_Text(pDX, IDC_rtime, m_rtime);
DDX_Text(pDX, IDC_senddata, m_senddata);
DDX_Text(pDX, IDC_stime, m_stime);
DDX_CBIndex(pDX, IDC_stopbit, m_stopbit);
DDX_Text(pDX, IDC_data, m_data);
DDX_Text(pDX, IDC_data2, m_data2);
DDX_Text(pDX, IDC_data3, m_data3);
DDX_Text(pDX, IDC_data4, m_data4);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CApicomDlg, CDialog)
//{{AFX_MSG_MAP(CApicomDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_send, Onsend)
ON_BN_CLICKED(IDC_init, Oninit)
ON_BN_CLICKED(IDC_read, Onread)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_pause, Onpause)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CApicomDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch (nIDEvent)
{
case 1: {
Onsend();
break;
}
case 2: {
Onread();
break;
}
}
CDialog::OnTimer(nIDEvent);
}
unsigned short CApicomDlg::Getcmd_CRC(unsigned char *cmdbuf,int cmdlen)
{
unsigned short crcreg,crcbuf;
int i,j;
crcreg=0xffff;
for(i=1;i<cmdlen;i++){
crcreg=crcreg^cmdbuf[i];
for(j=0;j<8;j++){
crcbuf=crcreg;
crcreg>>=1;
if(crcbuf&0x01)
crcreg^=0xa001;
}
}
return crcreg;
}
void CApicomDlg::Oninit()
{
// TODO: Add your control notification handler code here
UpdateData (true);
unsigned char check_code=0;
DCB dcb;
int kk;
COMMTIMEOUTS comtimeout;
char szPort[100];
tong=0;
butong=-1;
wsprintf( szPort, "COM%d", m_comsel+1 );
strcpy ((char *)msg1,m_senddata);//"@01RD17");
kk=strlen (m_senddata);
//*(unsigned short *)&msg1[kk]=Getcmd_CRC(msg1,kk);
check_code=msg1[1];
for (int i=2;i<kk;i++)
check_code=check_code^msg1[i];
if ((check_code&0x0f)>=0x0a)
msg1[kk+1]=(check_code&0x0f)+0x37;
else msg1[kk+1]=(check_code&0x0f)+0x30;
if (((check_code>>4)&0x0f)>=0x0a)
msg1[kk]=((check_code>>4)&0x0f)+0x37;
else msg1[kk]=((check_code>>4)&0x0f)+0x30;
msg1[kk+2]=0x0D;
if (hCom)
{
if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
CloseHandle( hCom);
hCom= NULL;
Sleep (10);
}
hCom=CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL );
if( hCom == INVALID_HANDLE_VALUE)
{
AfxMessageBox ("初始化不成功!");
return ;
}
ZeroMemory(&dcb,sizeof(dcb));
dcb.DCBlength=sizeof(dcb);
kk=GetCommState(hCom,&dcb);
dcb.BaudRate= m_baudrate;
dcb.ByteSize=m_databit;
dcb.fParity=1;
dcb.Parity=m_parity;
dcb.StopBits=m_stopbit;
dcb.XoffChar=0x00;
kk=SetCommState(hCom,&dcb);
kk=GetCommTimeouts(hCom,&comtimeout);
comtimeout.ReadIntervalTimeout =1;
kk=SetCommTimeouts(hCom,&comtimeout);
kk=SetupComm(hCom,512,512);//设置缓冲区大小
memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
if (m_stime)
SetTimer(1,m_stime,NULL);
}
void CApicomDlg::Onsend()
{
DWORD ByteCount=400;
unsigned char check_code=0;
int kk;
COMSTAT ComStat;
DWORD dwErrorFlages;
UpdateData (true);
strcpy ((char *)msg1,m_senddata);//"@01RD17");
kk=strlen (m_senddata);
//msg1[2]=(((msg1[2]-48)%4)+49);
m_senddata=msg1;
check_code=msg1[1];
for (int i=2;i<kk;i++)
check_code=check_code^msg1[i];
if ((check_code&0x0f)>=0x0a)
msg1[kk+1]=(check_code&0x0f)+0x37;
else msg1[kk+1]=(check_code&0x0f)+0x30;
if (((check_code>>4)&0x0f)>=0x0a)
msg1[kk]=((check_code>>4)&0x0f)+0x37;
else msg1[kk]=((check_code>>4)&0x0f)+0x30;
msg1[kk+2]=0x23; //结束符:XMTD:0x23;
//数显表:0x 0d;
kk=strlen ((char *)msg1);
ClearCommError(hCom,&dwErrorFlages,&ComStat);
WriteFile(hCom,msg1,kk,&ByteCount,&m_OverlappedWrite );
if (m_rtime)
SetTimer(2,m_rtime,NULL);
if (m_stime)
SetTimer(1,m_stime,NULL);
CClientDC dc (this);
dc.TextOut (90,220,"通讯忙!");
//Onread();
}
void CApicomDlg::Onread()
{
KillTimer( 2 );
ZeroMemory(buf,sizeof(buf));
unsigned long length=1;
int RLength,i;
COMSTAT ComStat;
DWORD dwErrorFlages;
CClientDC dc (this);
char tempch[10];
int flag=0;
int temp=0;
do {
flag++;
ClearCommError(hCom,&dwErrorFlages,&ComStat);
RLength=ComStat.cbInQue;
if(RLength>0)
{
for (i=0;i<RLength;i++)//以重叠方式接收指定字符,函数立即返回
{
ReadFile(hCom,&buf[temp],length,&length,&m_OverlappedRead);
if ((buf[temp]==0x0d)||((temp>=5)&&(buf[temp]==0x00)))
{
//for (i=0;i<90;i++)
// buf[i]=buf[i+1];
char buff[4];
for (i= 0 ;i<2;i++) //XMTD
{
if (buf[5+i]>0x39)
buff[i] = buf[5+i]-0x37;
else buff[i] = buf[5+i]-0x30;
} //XMTD
/* for (i= 0 ;i<2;i++) //新数显
{
if (buf[9+i]>0x39)
buff[i] = buf[9+i]-0x37;
else buff[i] = buf[9+i]-0x30;
} */ //新数显
for (i= 0 ;i<2;i++)
{
if (buf[7+i]>0x39)
buff[2+i] = buf[7+i]-0x37;
else buff[2+i] = buf[7+i]-0x30;
}
if (buf[2]==49)
m_data=CS16toint(buff);
else if (buf[2]==50)
m_data2=CS16toint(buff);
else if (buf[2]==51)
m_data3=CS16toint(buff);
else if (buf[2]==52)
m_data4=CS16toint(buff);
else
butong++;
m_readdata=buf;
UpdateData (FALSE);
tong ++;
dc.TextOut (290,85," ");
itoa (tong,tempch,10);
dc.TextOut (290,85,tempch);
dc.TextOut (490,85," ");
itoa (flag,tempch,10);
dc.TextOut (490,85,tempch);
if (butong<0)
butong=0;
dc.TextOut (90,85," ");
itoa (butong,tempch,10);
dc.TextOut (90,85,tempch);
dc.TextOut (90,220,"通讯闲!");
return;
}
else temp++;
}
}
}
while (flag<20);
butong++;
dc.TextOut (90,85," " );
itoa (butong,tempch,10);
dc.TextOut (90,85,tempch);
dc.TextOut (290,85," " );
itoa (tong,tempch,10);
dc.TextOut (290,85,tempch);
m_readdata=buf;
UpdateData (FALSE);
dc.TextOut (490,85," " );
itoa (flag,tempch,10);
dc.TextOut (490,85,tempch);
m_data=0;
dc.TextOut (90,220,"通讯闲!");
}
/////////////////////////////////////////////////////////////////////////////
// CApicomDlg message handlers
BOOL CApicomDlg::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
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CApicomDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// this is automatically done for you by the framework.
void CApicomDlg::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 CApicomDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CApicomDlg::Onpause()
{
// TODO: Add your control notification handler code here
KillTimer( 1 );
KillTimer( 2 );
if (hCom)
{
if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
CloseHandle( hCom);
hCom= NULL;
}
}
float CApicomDlg::CS16toint(char *buff)
{
int disp_v=1;
int i=0;
signed short int disp_v1;
disp_v1 = buff[0]*0x1000+ \
buff[1]*0x100 + \
buff[2]*0x10 + \
buff[3];
float disp=disp_v1;
for (i=0;i<buf[12]-48;i++)
disp_v =disp_v*10;
return disp/disp_v;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -