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

📄 comport.cpp

📁 基于BlueSleil的Sample 查找附近的蓝牙设备 确定安装了蓝牙和BlueSleil
💻 CPP
字号:
#include "Comport.h"
#include "SocketCommunication.h"
#include "Config.h"

HANDLE OpenPort(UCHAR nPort)
{
	HANDLE handle;
	char  buf[64];
	DWORD nread = 64;

	sprintf(buf,"\\\\.\\COM%d",nPort);
	printf("com port:%d\n", nPort);
	// open the com port.
	handle = CreateFile(buf, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
	if (handle == INVALID_HANDLE_VALUE){
		printf("Failed to open COM port %d, last error=%d\n",nPort,GetLastError());
		return INVALID_HANDLE_VALUE;
	}

	DCB dcb;
	COMMTIMEOUTS commTimeouts;
	
	GetCommState((HANDLE)handle,&dcb);
	dcb.BaudRate = CBR_115200;
	dcb.Parity = NOPARITY;
	dcb.ByteSize = 8;
	dcb.StopBits = ONESTOPBIT;
	SetCommState((HANDLE)handle,&dcb);

	commTimeouts.ReadIntervalTimeout = MAXDWORD;
	commTimeouts.ReadTotalTimeoutConstant = 0;
	commTimeouts.ReadTotalTimeoutMultiplier = 0;
	commTimeouts.WriteTotalTimeoutConstant = 100;
	commTimeouts.WriteTotalTimeoutMultiplier = 10;
	SetCommTimeouts((HANDLE)handle,&commTimeouts);
	PurgeComm((HANDLE)handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );
	SetupComm((HANDLE)handle, 1024, 1024);
	EscapeCommFunction((HANDLE)handle,SETRTS);
	EscapeCommFunction((HANDLE)handle,SETDTR);

	return handle;
}

BOOL SendData(HANDLE hPort)
{
	// Write AT command to Modem.
	OVERLAPPED writeo, reado;	
	DWORD dwErrors;
	DWORD byte_sent;
	BOOL   ret = TRUE;
	BOOL  bWaitingOnWrite = TRUE;
	COMSTAT comStat;  
	DWORD nwritten;
	CHAR buf[256]={0};
	nwritten = 0;

	memset(&writeo,0,sizeof(OVERLAPPED));
	writeo.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	memset(&reado,0,sizeof(OVERLAPPED));
	reado.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	if ( !WriteFile(hPort, "AT\0", 3, &byte_sent, &writeo))
	{
		dwErrors=GetLastError();
		if ( dwErrors == ERROR_IO_PENDING) 
		{ 
			while(!GetOverlappedResult((HANDLE)hPort, &writeo, &byte_sent, TRUE))
			{
				if ( GetLastError() == ERROR_IO_INCOMPLETE)
				{
              		nwritten += byte_sent;
					continue;
				}
				else
				{
					ClearCommError((HANDLE)hPort, &dwErrors, &comStat); 
					break;
				}
           	}
			nwritten += byte_sent;			
		}
		else
		{ 
			ClearCommError((HANDLE)hPort, &dwErrors, &comStat);
		} 
	}
	else{
		nwritten += byte_sent;
	}

	if ( nwritten < 3 )
	{
		CloseHandle(hPort);
		ret=FALSE;
		goto check_exit;
	}

	printf("Sent data to com port:AT\r\n");
check_exit:
	if(writeo.hEvent){
		CloseHandle(writeo.hEvent);
	}	
	if(reado.hEvent){
		CloseHandle(reado.hEvent);
	}
	return ret;
}

INT32 HandleComPortData(HANDLE hComPort)
{
	DWORD nreturned;
	OVERLAPPED writeo, reado;	
	DWORD dwErrors;
	BOOL  bWaitingOnWrite = TRUE;
	COMSTAT comStat;  
	CHAR buf[MAX_BUFLEN]={0};

	if(hComPort==INVALID_HANDLE_VALUE)
	{
		return -1;
	}

	memset(&writeo,0,sizeof(OVERLAPPED));
	writeo.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	memset(&reado,0,sizeof(OVERLAPPED));
	reado.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	if(!ReadFile(hComPort, buf, MAX_BUFLEN, &nreturned, &reado) )
	{
		
		if (GetLastError() == ERROR_IO_PENDING) 
		{ 
			DWORD dwRes;
			dwRes = WaitForSingleObject(reado.hEvent, 2000);
			switch(dwRes)
			{
    			case WAIT_OBJECT_0: 
    				GetOverlappedResult(hComPort, &reado, &nreturned, FALSE);
    				break;
    			default:
    				goto HandleComPortData_Exit;
			}
		}
		else
		{ 
			ClearCommError( hComPort, &dwErrors, &comStat); 
		}
	}
	printf("SPPEX Server Received data: %s\n", buf);

	SockClient(buf, nreturned);
    HandleComPortData_Exit:
	CloseHandle(writeo.hEvent);
	CloseHandle(reado.hEvent);
	return 0;
}


BOOL StartIoOnComport(DWORD dwConnHandle,INT32 nComport, BOOL bClientRole)
{
	INT32 i;
	DWORD dwID;
	BOOL bRet = FALSE;

	for(i = 0; i<MAX_IO_THREAD; i++)
	{
	    if (dwConnHandle == g_comIoList[i].dwConnHandle)
	    {
	        return FALSE;
	    }
		
		if(g_comIoList[i].hThread == NULL)
		{
			g_comIoList[i].nComPort = nComport;
			g_comIoList[i].dwConnHandle = dwConnHandle;
			if(bClientRole)
				g_comIoList[i].hThread = CreateThread(NULL,0,SPPClientIOThread,(LPVOID)i,0,&dwID);		
			else
				g_comIoList[i].hThread = CreateThread(NULL,0,SPPServerIOThread,(LPVOID)i,0,&dwID);
			if(g_comIoList[i].hThread == NULL){
				memset(&g_comIoList[i], 0, sizeof(COM_IO));
				bRet = FALSE;
			}else
				bRet = TRUE;
		   break;
		}
	}

	return bRet;
}

BOOL StopIoOnComport(DWORD dwConnHandle)
{
	INT32 i;
	BOOL bRet = FALSE;
	
	for(i = 0; i<MAX_IO_THREAD; i++)
	{
		if((dwConnHandle == 0  || dwConnHandle == g_comIoList[i].dwConnHandle) && g_comIoList[i].hThread != NULL)
		{
			g_comIoList[i].bStopFlag = TRUE;
			if(WaitForSingleObject(g_comIoList[i].hThread, 3000) != WAIT_OBJECT_0)
				TerminateThread(g_comIoList[i].hThread, -1);
			CloseHandle(g_comIoList[i].hThread);
			memset(&g_comIoList[i], 0, sizeof(COM_IO));	
			bRet = TRUE;
			if(dwConnHandle != 0)
				break;
		}
	}
	
	return bRet;
	
}

DWORD WINAPI SPPClientIOThread(LPVOID param)
{

	INT32 nIndex = (INT32)param;

	HANDLE hComPort = OpenPort(g_comIoList[nIndex].nComPort);
	if(hComPort == INVALID_HANDLE_VALUE)
	{
		CloseHandle(g_comIoList[nIndex].hThread);
		memset(&g_comIoList[nIndex],0, sizeof(COM_IO));
		return 0;
	}

	while(g_comIoList[nIndex].bStopFlag != TRUE && g_bFlag)
	{
		SendData(hComPort);
		Sleep(1000);
	}
	
	CloseHandle(hComPort);
	return 0;
}

DWORD WINAPI SPPServerIOThread(LPVOID param)
{

	INT32 nIndex = (INT32)param;

	HANDLE hComPort = OpenPort(g_comIoList[nIndex].nComPort);
	if(hComPort == INVALID_HANDLE_VALUE)
	{
		CloseHandle(g_comIoList[nIndex].hThread);
		memset(&g_comIoList[nIndex],0, sizeof(COM_IO));
		return 0;
	}

	while(g_comIoList[nIndex].bStopFlag != TRUE && g_bFlag)
	{
		HandleComPortData(hComPort);
		Sleep(1000);
	}
	
	CloseHandle(hComPort);
	return 0;
}

⌨️ 快捷键说明

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