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

📄 com.cpp

📁 串口通信
💻 CPP
字号:
// com.cpp : Defines the entry point for the DLL application.
//

#include <windows.h>

#define LIBAPI extern "C" __declspec(dllexport)

#include "com.h"

//int OpenOrClose = 0;
///////////////////////////////////////////////////////////////////////////////
// 全局变量
BOOL			g_bHasCreated[2];
HANDLE			g_hComm[2];
OVERLAPPED		g_osWrite[2];

BOOL forward(UINT nCommID, unsigned int n);			//快速前进
BOOL sforward(UINT nCommID, unsigned int n);		//慢速前进
BOOL back(UINT nCommID, unsigned int n);			//快速后退
BOOL sback(UINT nCommID, unsigned int n);			//慢速后退
BOOL right(UINT nCommID, unsigned int n);			//顺时针旋转
BOOL left(UINT nCommID, unsigned int n);			//逆时针旋转
BOOL nip(UINT nCommID);								//镊子夹紧
BOOL loose(UINT nCommID);							//镊子松开

///////////////////////////////////////////////////////////////////////////////
// DllMain
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	for(int i = 0; i < 2; i++)
	{
		g_bHasCreated[i] = FALSE;
		g_hComm[i]       = NULL;
	}
    return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
// Create Comm
HRESULT SC_CreatCom(int n)
{
	DCB dcb;

	switch(n)
	{
		case 0:	
			{
				if(g_bHasCreated)
					break;

				g_hComm[0] = CreateFile("COM1",
									    GENERIC_READ|GENERIC_WRITE,
									    0,
								 	    NULL,
									    OPEN_EXISTING,
									    FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
									    NULL);

				if(g_hComm[0] == INVALID_HANDLE_VALUE)
					return SC_FAILED;

				if(!GetCommState(g_hComm[0], &dcb))
					return SC_COM_ERROR_GETSTATE;

				dcb.BaudRate = 9600;
				dcb.ByteSize = 8;
				dcb.Parity   = NOPARITY;
				dcb.StopBits = ONESTOPBIT;
				
				if(!SetCommState(g_hComm[0], &dcb))
					return SC_FAILED;

				g_bHasCreated[0] = TRUE;
			}
			break;

		case 1: 
			{
				if(g_bHasCreated[1])
					break;

				g_hComm[1] = CreateFile("COM2",
									    GENERIC_READ|GENERIC_WRITE,
									    0,
									    NULL,
									    OPEN_EXISTING,
									    FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
									    NULL);
				if(g_hComm[1] == INVALID_HANDLE_VALUE)
					return SC_FAILED;

				if(!GetCommState(g_hComm[1], &dcb))
					return SC_COM_ERROR_GETSTATE;

				dcb.BaudRate = 9600;
				dcb.ByteSize = 8;
				dcb.Parity   = NOPARITY;
				dcb.StopBits = ONESTOPBIT;
				
				if(!SetCommState(g_hComm[1], &dcb))
					return SC_FAILED;

				g_bHasCreated[1] = TRUE;
			}
			break;

		default:
			return SC_COM_ERROR_NUM;
	}

	return SC_SUCCESS;
}

///////////////////////////////////////////////////////////////////////////////
// Close Comm 
HRESULT SC_CloseCom(UINT nCommID, LPVOID lpParam)
{
	if(!CloseHandle(g_hComm[nCommID]))
		return SC_FAILED;

	g_bHasCreated[nCommID] = FALSE;
	return SC_SUCCESS;
}

///////////////////////////////////////////////////////////////////////////////
// Motion
HRESULT SC_Move(const UINT type, LPVOID lpParam)
{
	LPMOVEPARAM lpMOVE = (LPMOVEPARAM)lpParam;
	switch (type)
	{
		case SC_MOVE_FORWARD:
			{
				if (!forward(lpMOVE->nCommID, lpMOVE->n))
					return SC_FAILED;				
			}
			break;	 

		case SC_MOVE_SFORWARD:
			{
				if (!sforward(lpMOVE->nCommID, lpMOVE->n))
					return SC_FAILED;
			}
			break;

		case SC_MOVE_BACK:
			{
				if (!back(lpMOVE->nCommID, lpMOVE->n))
					return SC_FAILED;
			}
			break;

		case SC_MOVE_SBACK:
			{
				if (!sback(lpMOVE->nCommID, lpMOVE->n))
					return SC_FAILED;
			}
			break;

		case SC_MOVE_RIGHT:
			{
				if (!right(lpMOVE->nCommID, lpMOVE->n))
					return SC_FAILED;
			}
			break;	 

		case SC_MOVE_LEFT:
			{
				if (!left(lpMOVE->nCommID, lpMOVE->n))
					return SC_FAILED;
			}
			break;

		case SC_MOVE_NIP:
			{
				if (!nip(lpMOVE->nCommID))
					return SC_FAILED;
			}
			break;

		case SC_MOVE_LOOSE:
			{
				if (!loose(lpMOVE->nCommID))
					return SC_FAILED;
			}
			break;

		default:
			return SC_MOVE_ERROR;
	}
	return SC_SUCCESS;
}


///////////////////////////////////////////////////////////////////////////////
// Read Buffer
HRESULT SC_ReadBuffer(UINT nCommID, char *InBuffer, LPVOID lpParam)
{
	DWORD nBytesToRead = 4;
	DWORD nBytesRead;

	DWORD dwError;
	COMSTAT cs;
	ClearCommError(g_hComm, &dwError, &cs);

	if(cs.cbInQue != 4)
		return SC_FAILED;

	if(!ReadFile(g_hComm[nCommID], InBuffer, nBytesToRead, &nBytesRead, &g_osWrite[nCommID]))
		return SC_FAILED;

	return SC_SUCCESS;
}
	

///////////////////////////////////////////////////////////////////////////////
// Global Functions
BOOL forward(UINT nCommID, unsigned int n)
{
	BOOL fState;
	DWORD nBytesToWrite=4;
	DWORD nBytesWritten;

	char Tx[4];
	Tx[0]='C';
	Tx[1]='F';
	Tx[2]=0;
	Tx[3]=0;

	short int *temp=(short int*) &Tx[2];
	*temp=n;

	fState = WriteFile(g_hComm[nCommID], Tx, nBytesToWrite, &nBytesWritten, &g_osWrite[nCommID]);
	return fState;
}

BOOL sforward(UINT nCommID, unsigned int n)
{
	BOOL fState;
	DWORD nBytesToWrite=4;
	DWORD nBytesWritten;

	char Tx[4];
	Tx[0]='C';
	Tx[1]='F';
	Tx[2]=0;
	Tx[3]=0;

	short int *temp=(short int*) &Tx[2];
	*temp=n;

	fState = WriteFile(g_hComm[nCommID], Tx, nBytesToWrite, &nBytesWritten, &g_osWrite[nCommID]);
	return fState;
}

BOOL back(UINT nCommID, unsigned int n)
{
	BOOL fState;
	DWORD nBytesToWrite=4;
	DWORD nBytesWritten;

	char Tx[4];
	Tx[0]='C';
	Tx[1]='B';
	Tx[2]=0;
	Tx[3]=0;

	short int *temp=(short int*) &Tx[2];
	*temp=n;

	fState = WriteFile(g_hComm[nCommID], Tx, nBytesToWrite, &nBytesWritten, &g_osWrite[nCommID]);
	return fState;
}

BOOL sback(UINT nCommID, unsigned int n)
{
	BOOL fState;
	DWORD nBytesToWrite=4;
	DWORD nBytesWritten;

	char Tx[4];
	Tx[0]='C';
	Tx[1]='F';
	Tx[2]=0;
	Tx[3]=0;

	short int *temp=(short int*) &Tx[2];
	*temp=n;

	fState = WriteFile(g_hComm[nCommID], Tx, nBytesToWrite, &nBytesWritten, &g_osWrite[nCommID]);
	return fState;
}

BOOL right(UINT nCommID, unsigned int n)
{
	BOOL fState;
	DWORD nBytesToWrite=4;
	DWORD nBytesWritten;

	char Tx[4];
	Tx[0]='C';
	Tx[1]='R';
	Tx[2]=0;
	Tx[3]=0;

	short int *temp=(short int*) &Tx[2];
	*temp=n;

	fState = WriteFile(g_hComm[nCommID], Tx, nBytesToWrite, &nBytesWritten, &g_osWrite[nCommID]);
	return fState;
}

BOOL left(UINT nCommID, unsigned int n)
{
	BOOL fState;
	DWORD nBytesToWrite=4;
	DWORD nBytesWritten;

	char Tx[4];
	Tx[0]='C';
	Tx[1]='L';
	Tx[2]=0;
	Tx[3]=0;

	short int *temp=(short int*) &Tx[2];
	*temp=n;

	fState = WriteFile(g_hComm[nCommID], Tx, nBytesToWrite, &nBytesWritten, &g_osWrite[nCommID]);
	return fState;
}

BOOL nip(UINT nCommID)
{
	BOOL fState;
	DWORD nBytesToWrite=4;
	DWORD nBytesWritten;

	char Tx[4];
	Tx[0]='C';
	Tx[1]='F';
	Tx[2]=0;
	Tx[3]=0;

	fState = WriteFile(g_hComm[nCommID], Tx, nBytesToWrite, &nBytesWritten, &g_osWrite[nCommID]);
	return fState;
}

BOOL loose(UINT nCommID)
{
	BOOL fState;
	DWORD nBytesToWrite=4;
	DWORD nBytesWritten;

	char Tx[4];
	Tx[0]='C';
	Tx[1]='F';
	Tx[2]=0;
	Tx[3]=0;

	fState = WriteFile(g_hComm[nCommID], Tx, nBytesToWrite, &nBytesWritten, &g_osWrite[nCommID]);
	return fState;
}

⌨️ 快捷键说明

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