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

📄 newdll.cpp

📁 串口动态连接库
💻 CPP
字号:
// newdll.cpp : Defines the entry point for the DLL application.
// commdll.dll 动态连接库

#include "stdafx.h"
#include <time.h>
#include "newdll.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{

    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
    return TRUE;
}


DLLAPI HANDLE OpenComm(int port,int BaudRate,int ByteSize,int stop)
{  
	int ret;
	if(IsOpen()) 
		CloseComm();

	COMMTIMEOUTS Timeouts;
    if(port==1)                                                                                                                                                                                                                                                                                 
       pComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);
	else if(port==2)
       pComm = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);	
	else if(port==3)
       pComm = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);			
	else
		return (void *)(-1);
	if(pComm==INVALID_HANDLE_VALUE)
		return (void *)(-1);
    if(!SetCommMask(pComm,EV_RXFLAG))
		return (void *)(-1);
	if(!SetupComm(pComm,1024,1024))
		return (void *)(-1);
	DCB dcb;
    GetCommState(pComm,&dcb); 
	dcb.BaudRate = BaudRate;
	dcb.Parity = NOPARITY;
    dcb.ByteSize = ByteSize;
	dcb.StopBits = ONESTOPBIT;
	dcb.fDsrSensitivity = FALSE;
    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fOutX = FALSE;
    dcb.fInX = FALSE;
	dcb.fBinary = TRUE;
	dcb.fParity = FALSE;
	dcb.DCBlength = sizeof( DCB );
	if(!SetCommState(pComm,&dcb))
		return (void *)(-1);
	Timeouts.ReadIntervalTimeout=50;
    Timeouts.ReadTotalTimeoutConstant=500;
	Timeouts.ReadTotalTimeoutMultiplier=50;
    Timeouts.WriteTotalTimeoutConstant=500;
	Timeouts.WriteTotalTimeoutMultiplier=50;
	SetCommTimeouts(pComm,&Timeouts);
    return pComm;
}


DLLAPI HANDLE OpenPort(int port)
{
    if( CheckDate() < 0 ) 
		return 0;
   
	int ret;
	if(IsOpen()) 
		CloseComm();

	COMMTIMEOUTS Timeouts;
    if(port==1)                                                                                                                                                                                                                                                                                 
       pComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);
	else if(port==2)
       pComm = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);	
	else if(port==3)
       pComm = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);			
	else
		return (void *)(-1);
	if(pComm==INVALID_HANDLE_VALUE)
		return (void *)(-1);
    if(!SetCommMask(pComm,EV_RXFLAG))
		return (void *)(-1);
	if(!SetupComm(pComm,1024,1024))
		return (void *)(-1);
	DCB dcb;
    GetCommState(pComm,&dcb); 
	dcb.BaudRate = 9600;
	dcb.Parity = NOPARITY;
    dcb.ByteSize = 8;
	dcb.StopBits = ONESTOPBIT;
	dcb.fDsrSensitivity = FALSE;
    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fOutX = FALSE;
    dcb.fInX = FALSE;
	dcb.fBinary = TRUE;
	dcb.fParity = FALSE;
	dcb.DCBlength = sizeof( DCB );
	if(!SetCommState(pComm,&dcb))
		return (void *)(-1);
	Timeouts.ReadIntervalTimeout=50;
    Timeouts.ReadTotalTimeoutConstant=500;
	Timeouts.ReadTotalTimeoutMultiplier=50;
    Timeouts.WriteTotalTimeoutConstant=500;
	Timeouts.WriteTotalTimeoutMultiplier=50;
	SetCommTimeouts(pComm,&Timeouts);
    return pComm;
}


DLLAPI int CloseComm()
{
	if(IsOpen())
	{
      CloseHandle(pComm);
      pComm = INVALID_HANDLE_VALUE;
      bOverlapped = FALSE;
	}
	return 0;
}
 

DLLAPI int ReadComm(uchar *buffer,uint dwCount)
{
    if( CheckDate() < 0 ) 
		return 0;
    unsigned char buff[30];
	if(!IsOpen())
	return -1;
	DWORD dwBytesRead = 0;
	bool bSuccess = 1;
	bSuccess = ReadFile(pComm,buff,dwCount,&dwBytesRead,&overlapped);
	if (!bSuccess)
	{
       if (GetLastError() != ERROR_IO_PENDING)
       {
		   WaitForSingleObject(overlapped.hEvent,1000);
		   return ((int)dwBytesRead);
	   }
	   return 0;
	}
	return (int)dwBytesRead;
}

DLLAPI int WriteComm(uchar *buffer,uint dwCount)
{
    if( CheckDate() < 0 ) 
		return 0;

	if(!IsOpen())
		return -1;
	DWORD dwBytesWrite = 0;
    memset(&overlapped, 0, sizeof(OVERLAPPED));
    overlapped.hEvent = ::CreateEvent(NULL, TRUE, FALSE,NULL);
	bool bSuccess = 1;
	bSuccess = WriteFile(pComm,buffer,dwCount,&dwBytesWrite,&overlapped);
	if (!bSuccess)
	{
       if (GetLastError() != ERROR_IO_PENDING)
       {
		   WaitForSingleObject(overlapped.hEvent,1000);
		   return ((int)dwBytesWrite);
	   }
	   return 0;
	}
	return (int)dwBytesWrite;
}

DLLAPI int WriteDataCode(uchar *buffer,uint dwCount)
{
    if( CheckDate() < 0 ) 
		return 0;

	uchar buf[64];
	int i,t;
	if(!IsOpen())
		return -1;
	memcpy(buf,buffer,dwCount);
    for(i=0,t=0;i<dwCount;i++)
		 t=t+buf[i];
    buf[i]=t;

	DWORD dwBytesWrite = 0;
    memset(&overlapped, 0, sizeof(OVERLAPPED));
    overlapped.hEvent = ::CreateEvent(NULL, TRUE, FALSE,NULL);
	bool bSuccess = 1;
	bSuccess = WriteFile(pComm,buffer,dwCount+1,&dwBytesWrite,&overlapped);
	if (!bSuccess)
	{
       if (GetLastError() != ERROR_IO_PENDING)
       {
		   WaitForSingleObject(overlapped.hEvent,1000);
		   return ((int)dwBytesWrite);
	   }
	   return 0;
	}
	return (int)dwBytesWrite;
}

DLLAPI int ConvertHexChar(char ch)
{
   if((ch>='0')&&(ch<='9'))
	   return ch-0x30;
   else if((ch>='A')&&(ch<='Z'))
	   return ch-'A'+10;
   else if((ch>='a')&&(ch<='z'))
	   return ch-'a'+10;
   else return -1;
}

DLLAPI uchar String2Hex(char *str, unsigned char *senddata,int len)
{
	int hexdata,lowhexdata;
	uchar hexdatalen=0;
	char lstr,hstr,str1[30];
	uchar hex[64];
	for(int i=0;i<len*2;)
	{		
		hstr=str[i];
	    i++;
		lstr=str[i];
		hexdata=ConvertHexChar(hstr);
		lowhexdata=ConvertHexChar(lstr);
		if((hexdata==16)||(lowhexdata==16))
			break;
		else
			hexdata=hexdata*16+lowhexdata;
		i++;
		hex[hexdatalen]=(uchar)hexdata;
		hexdatalen++;
	}
	memcpy(senddata,hex,hexdatalen);
	return hexdatalen;
}


DLLAPI bool IsDigit(uchar pCh)
{
	if(pCh>='0' && pCh<='9')
		return true;
	else if(pCh='.') 
	    return true;
	else
	    return false;
}

DLLAPI int IsOpen()
{
	return pComm != INVALID_HANDLE_VALUE;
}

DLLAPI void fdelay(int t)
{
	int i,j,a;
    for(i = 0;i < t; i++)
     for(j = 0; j < t; j++)
        a = 0;
}

DLLAPI void WaitMs(long t)
{
	Sleep(t);
}

int CheckDate()
{
    char tmpbuf[10], buf[6],
	int i;
	long int temp;
    _strdate( tmpbuf );
    buf[2] = tmpbuf[0];
	buf[3] = tmpbuf[1];
	buf[4] = tmpbuf[3];
	buf[5] = tmpbuf[4];
	buf[0] = tmpbuf[6];
	buf[1] = tmpbuf[7];

    for(i = 0,temp = 0; i < 6; i++)
	   temp = temp*10 + buf[i] - 48;
	if( temp > 41110 ) 
		return -1;
	else return 0;
}

int StrToInt(char *s, int count)
{
   int i,temp;
   for(i=0,temp=0;i<count;i++)
	   temp = temp*10 + s[i] - 48;
   return temp;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -