⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ser_readorwrite.cpp

📁 evc编程,使用数据库软件
💻 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 + -