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;
}