📄 ser_readorwrite.cpp
字号:
// Ser_ReadorWrite.cpp: implementation of the CSer_ReadorWrite class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "dzct.h"
#include "Ser_ReadorWrite.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSer_ReadorWrite::CSer_ReadorWrite()
{
theApp.hPort=INVALID_HANDLE_VALUE;
}
CSer_ReadorWrite::~CSer_ReadorWrite()
{
PortClose();
}
bool CSer_ReadorWrite::PortClose()
{
DWORD dwError;
if(theApp.hPort!=INVALID_HANDLE_VALUE)
{
if(!CloseHandle(theApp.hPort))
{
dwError=GetLastError();
return false;
}
else
{
theApp.hPort=INVALID_HANDLE_VALUE;
return true;
}
}
return false;
}
bool CSer_ReadorWrite::Ser_initialize()
{
DWORD dwError;
DCB PortDCB;
COMMTIMEOUTS CommTimeouts;
theApp.hPort=CreateFile(_T("COM1:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(theApp.hPort==INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("不能打开COM1"));
dwError=GetLastError();
return false;
}
PortDCB.DCBlength=sizeof(DCB);
GetCommState(theApp.hPort,&PortDCB);
PortDCB.BaudRate=theApp.yq.btn;
PortDCB.fBinary=true;
PortDCB.fParity=false;
PortDCB.fOutxCtsFlow=false;
PortDCB.fOutxDsrFlow=false;
PortDCB.fDsrSensitivity=false;
PortDCB.fDtrControl=DTR_CONTROL_ENABLE;
PortDCB.fTXContinueOnXoff=true;
PortDCB.fOutX=false;
PortDCB.fInX=false;
PortDCB.fErrorChar=false;
PortDCB.fRtsControl=RTS_CONTROL_ENABLE;
PortDCB.fNull=false;
PortDCB.fAbortOnError=false;
switch(theApp.yq.jo)
{
case 0:
PortDCB.Parity=NOPARITY;
break;
case 1:
PortDCB.Parity=ODDPARITY;
break;
case 2:
PortDCB.Parity=EVENPARITY;
break;
}
PortDCB.ByteSize=theApp.yq.sjw;
PortDCB.StopBits=ONESTOPBIT;
if(!SetCommState(theApp.hPort,&PortDCB))
{
AfxMessageBox(_T("不能配置串口"));
dwError=GetLastError();
return false;
}
GetCommTimeouts(theApp.hPort,&CommTimeouts);
CommTimeouts.ReadIntervalTimeout=0;
CommTimeouts.ReadTotalTimeoutConstant=0;
CommTimeouts.ReadTotalTimeoutMultiplier=0;
CommTimeouts.WriteTotalTimeoutMultiplier=0;
CommTimeouts.WriteTotalTimeoutConstant=0;
if(!SetCommTimeouts(theApp.hPort,&CommTimeouts))
{
AfxMessageBox(_T("不能配置超时"));
dwError=GetLastError();
return false;
}
EscapeCommFunction(theApp.hPort,SETDTR);
EscapeCommFunction(theApp.hPort,SETRTS);
return true;
}
DWORD PortReadWriteThread(LPVOID lpvoid)
{
CString str;
BYTE bit[1024];
TCHAR tch;
int i=0;
BOOL bul;
DWORD dwCommModemStatus,dwBytesTransgerred,dwNumBytesWritten;
do {
if(theApp.hPort!=INVALID_HANDLE_VALUE)
{
SetCommMask(theApp.hPort,EV_RXCHAR);
WaitCommEvent(theApp.hPort,&dwCommModemStatus,0);
if(dwCommModemStatus&EV_RXCHAR)
{
bul=ReadFile(theApp.hPort,bit,110,&dwBytesTransgerred,0);
}
Sleep(200);//1秒钟
if(!WriteFile(theApp.hPort,T_ACK,7*sizeof(BYTE),&dwNumBytesWritten,NULL))
{
AfxMessageBox(_T("计算机确认不成功"));
return 0;
}
for(i=0;i<110;i++)
{
tch=0;
tch=(tch<<8)&0xff00;
tch|=bit[i];
theApp.Ser_buf[i]=tch;
theApp.Ser_buf[i+1]='\0';
}
PostMessage(theApp.hWnd,WM_USERMESSAGE,0,0);//用户自定义消息
if(theApp.mode==1||theApp.cj==3)
{
return 0;
}
theApp.cj++;
Sleep(1000);//1秒钟
if(!WriteFile(theApp.hPort,T_C,8*sizeof(BYTE),&dwNumBytesWritten,NULL))
{
AfxMessageBox(_T("启动测量不成功"));
return 0;
}
}
}while(1);
CloseHandle(theApp.hReadThread);
return 0;
}
bool CSer_ReadorWrite::SerReadForAnser()
{
DWORD dwError;
theApp.hReadThread= CreateThread(NULL,0,PortReadWriteThread,0,0,&dwThreadID);
if(theApp.hReadThread)
{
;
// CloseHandle(theApp.hReadThread);
}
else
{
dwError=GetLastError();
return false;
}
return true;
}
DWORD PortReadThread(LPVOID lpvoid)//读确认
{
CString str;
BYTE bit[1024];
// TCHAR tch;
int i=0;
DWORD dwCommModemStatus,dwBytesTransgerred,dwNumBytesWritten;
if(theApp.hPort!=INVALID_HANDLE_VALUE)
{
SetCommMask(theApp.hPort,EV_RXCHAR);
WaitCommEvent(theApp.hPort,&dwCommModemStatus,0);
if(dwCommModemStatus&EV_RXCHAR)
{
ReadFile(theApp.hPort,bit,100*sizeof(BYTE),&dwBytesTransgerred,0);
/* for(i=0;i<110;i++)
{
tch=0;
tch=(tch<<8)&0xff00;
tch|=bit[i];
theApp.Ser_buf[i]=tch;
theApp.Ser_buf[i+1]='\0';
}
str=theApp.Ser_buf;
AfxMessageBox(str);
*/
AfxMessageBox(_T("11"));
}
if(!WriteFile(theApp.hPort,T_ACK,7*sizeof(BYTE),&dwNumBytesWritten,NULL))//需确认???
{
AfxMessageBox(_T("计算机确认不成功1"));
return 0;
}
PostMessage(theApp.hWnd,WM_USERMESSAGE1,0,0);//用户自定义消息
return 0;
}
return 0;
}
bool CSer_ReadorWrite::SerReadNoAnser()
{
DWORD dwError;
theApp.hReadThread=CreateThread(NULL,0,PortReadThread,0,0,&dwThreadID);
if(theApp.hReadThread)
{
CloseHandle(theApp.hReadThread);
}
else
{
dwError=GetLastError();
return false;
}
return true;
}
double CSer_ReadorWrite::widechartodouble(CString str)
{
char buf [250];
buf[0]='\0';
int i,len=wcslen(str);
for(i=0;i<len;i++)
{
switch(str.GetAt(i))
{
case '-':
buf[i]='-';
buf[i+1]='\0';
break;
case '.':
buf[i]='.';
buf[i+1]='\0';
break;
case '0':
buf[i]='0';
buf[i+1]='\0';
break;
case '1':
buf[i]='1';
buf[i+1]='\0';
break;
case '2':
buf[i]='2';
buf[i+1]='\0';
break;
case '3':
buf[i]='3';
buf[i+1]='\0';
break;
case '4':
buf[i]='4';
buf[i+1]='\0';
break;
case '5':
buf[i]='5';
buf[i+1]='\0';
break;
case '6':
buf[i]='6';
buf[i+1]='\0';
break;
case '7':
buf[i]='7';
buf[i+1]='\0';
break;
case '8':
buf[i]='8';
buf[i+1]='\0';
break;
case '9':
buf[i]='9';
buf[i+1]='\0';
break;
}
}
return atof(buf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -