📄 comport.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 + -