www.pudn.com > com_dllold.rar > com.cpp


 #include "stdafx.h" 
#include "com.h" 
#include "resource.h" 
 
 
static HANDLE h_com=INVALID_HANDLE_VALUE; 
static unsigned char hexchars[]="0123456789abcdef"; 
static DCB old_dcb; 
 
//////////////////////////////////////////////////////////////////////////////////// 
 
static int hex (unsigned char ch) 
{ 
  if ((ch >= 'a') && (ch <= 'f')) 
    return (ch - 'a' + 10); 
  if ((ch >= '0') && (ch <= '9')) 
    return (ch - '0'); 
  if ((ch >= 'A') && (ch <= 'F')) 
    return (ch - 'A' + 10); 
  return (-1); 
} 
//////////////////////////////////////////////////////////////////////////////////////// 
 
__declspec(dllexport) BOOL com_open(int num, int baud) 
{ 
	DCB dcb; 
	char name[10]; 
 
	if(num==1) 
		strcpy(name, "COM1"); 
	else 
		strcpy(name, "COM2"); 
 
	h_com =CreateFile( name, GENERIC_READ | GENERIC_WRITE, 
					0, 
					NULL, 
					OPEN_EXISTING, 
					FILE_ATTRIBUTE_NORMAL, 
					NULL ); 
 
	if(h_com==INVALID_HANDLE_VALUE) 
		return false; 
 
	if(SetCommMask(h_com, EV_RXCHAR|EV_TXEMPTY )==0) 
		return false; 
	//if(SetupComm( h_com, 20480,512)==0) 
		//return false; 
	if(PurgeComm( h_com, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR )==0) 
		return false; 
	 
	if(GetCommState(h_com, &dcb)==0) 
		return false; 
	old_dcb=dcb; 
	dcb.BaudRate =baud; 
	dcb.ByteSize =8; 
	dcb.Parity = NOPARITY; 
	dcb.StopBits = ONESTOPBIT; 
	dcb.fBinary = TRUE; 
	dcb.fParity = FALSE; 
	if(SetCommState(h_com, &dcb )==0) 
		return false; 
 
	return true; 
} 
 
__declspec(dllexport) BOOL com_close() 
{ 
	BOOL result; 
	if(h_com==INVALID_HANDLE_VALUE) 
		return false; 
	if(SetCommMask(h_com, NULL)==0) 
		return false; 
	//if(SetupComm( h_com, 20480,512)==0) 
		//return false; 
	if(SetCommState(h_com, &old_dcb )==0) 
		return false; 
	result=CloseHandle(h_com); 
	h_com=INVALID_HANDLE_VALUE; 
	return result; 
} 
 
__declspec(dllexport) BOOL is_com_opened() 
{ 
	if(h_com==INVALID_HANDLE_VALUE) 
		return false; 
	else 
		return true; 
} 
 
__declspec(dllexport) BOOL com_putchar(unsigned char ch, unsigned long *psize) 
{ 
	DWORD size; 
	BOOL result; 
 
	if(h_com==INVALID_HANDLE_VALUE) 
		return false; 
	result=WriteFile(h_com, &ch, 1, &size, NULL); 
	if(psize!=NULL) 
		*psize=size; 
	return result; 
} 
 
__declspec(dllexport) BOOL com_getchar(unsigned char *ch, unsigned long *psize) 
{ 
	DWORD size; 
	BOOL result; 
	if(h_com==INVALID_HANDLE_VALUE) 
		return false; 
	result=ReadFile(h_com, ch, 1, &size, NULL); 
	if(psize!=NULL) 
		*psize=size; 
	return result; 
} 
 
__declspec(dllexport) BOOL com_putpacket(unsigned char *buffer, unsigned long size, int dotry) 
{ 
	unsigned char checksum, *p, ch; 
	unsigned long i; 
	if(h_com==INVALID_HANDLE_VALUE) 
		return false; 
 
	do{ 
		com_putchar('$'); 
		checksum=0; 
		p=buffer; 
		for(i=0; i>4]); 
		com_putchar(hexchars[checksum%16]); 
		ch='\0'; 
		com_getchar(&ch); 
	}while(ch!='+' && dotry==0); 
	if(ch!='+') 
		return false; 
	else 
		return true; 
} 
 
__declspec(dllexport) unsigned long com_getpacket(unsigned char *buffer, unsigned long size) 
{ 
	unsigned char checksum1, checksum2, ch, *p; 
	unsigned long count; 
 
	if(h_com==INVALID_HANDLE_VALUE) 
		return -1; 
 
	while(1) 
	{ 
		do 
			com_getchar(&ch); 
		while(ch!='$'); 
		 
		p=buffer; 
		checksum1=0; 
		count=0; 
		while(count++<=size) 
		{ 
			com_getchar(&ch);				 
			if(ch=='#') 
			{ 
				com_getchar(&ch); 
				if(ch=='#') 
				{ 
					checksum1+=ch; 
					*p++=ch; 
				} 
				else 
					break; 
			} 
			else 
			{ 
				checksum1+=ch; 
				*p++=ch; 
			} 
		} 
		if(count-1>size) 
		{ 
			com_putchar('-'); 
			break; 
		} 
		checksum2=hex(ch)<<4; 
		com_getchar(&ch); 
		checksum2+=hex(ch); 
 
		if(checksum1==checksum2) 
		{ 
			com_putchar('+'); 
			return count-1; 
		} 
		else 
			com_putchar('-'); 
	} 
} 
 
__declspec(dllexport) BOOL com_try_connect(unsigned long timeouts) 
{ 
	unsigned char ch='C'; 
	BOOL result; 
	COMMTIMEOUTS commtimeouts; 
	if(h_com==INVALID_HANDLE_VALUE) 
		return false; 
 
	GetCommTimeouts(h_com, &commtimeouts); 
	commtimeouts.ReadTotalTimeoutConstant=timeouts; 
	SetCommTimeouts(h_com, &commtimeouts); 
 
	result=com_putpacket(&ch, 1, 1); 
 
	commtimeouts.ReadTotalTimeoutConstant=0; 
	SetCommTimeouts(h_com, &commtimeouts); 
	return result; 
} 
 
__declspec(dllexport) BOOL com_notify_again() 
{ 
	unsigned char ch='A'; 
	if(h_com==INVALID_HANDLE_VALUE) 
		return false; 
	com_putpacket(&ch, 1); 
	return true; 
} 
 
__declspec(dllexport) BOOL com_notify_over() 
{ 
	unsigned char ch='O'; 
	if(h_com==INVALID_HANDLE_VALUE) 
		return false; 
	com_putpacket(&ch, 1); 
	return true; 
}