📄 serial.cpp
字号:
// Serial.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "Serial.h"
//GPS call back array
extern FireEvent (GPSCallBack)[MAX_HANDLER];
//serial definition
HANDLE hPort=INVALID_HANDLE_VALUE;;
BOOL bFinish=false;
OVERLAPPED o;
DWORD dwEvtMask;
HANDLE hThread=NULL;
voidfun (SerialCallBack)[MAX_HANDLER];
//Buffer to store GPS and GSM data
char chBuffer[100];
char *chPtr;
int chBufferSize=0;
bool bStringFinish=true;
bool bStopCollectingData=false;
bool bOnCollectingData=false;
//functions forward declaration
DWORD WINAPI ReadThread(PVOID arg);
void OnFinishProgram()
{
bFinish=true;
//WaitForSingleObject(hThread,INFINITE);//wait 2 secs to close ReadThread loop
TerminateThread(hThread,0);
if (hThread!=NULL)
{
CloseHandle(hThread);
MessageBox(NULL,L"Close Thread OK",L"Thread status",MB_OK);
}
bFinish=false;
if (hPort!=INVALID_HANDLE_VALUE)
{
//MessageBox(NULL,L"Close Success",L"Serial Status",MB_OK);
CloseHandle(hPort);
}
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
OnFinishProgram();
break;
}
return TRUE;
}
// This is an example of an exported variable
SERIAL_API int nSerial=0;
// This is an example of an exported function.
SERIAL_API int fnSerial(void)
{
return 42;
}
// This is the constructor of a class that has been exported.
// see Serial.h for the class definition
//CSerial::CSerial()
//{
// return;
//}
//serial functions
SERIAL_API void SerialRead()
{
// TODO: Add your control notification handler code here
DWORD dwThreadID=0;
if (bOnCollectingData)
{
//MessageBox(NULL,L"Collecting right now",L"Read status",MB_OK);
return;
}
else
{
hThread=::CreateThread(NULL,0,ReadThread,NULL,0,&dwThreadID);
bOnCollectingData=true;
if (hThread==NULL) MessageBox(NULL,L"Reading Serial Port failed",L"Read status",MB_OK);
}
}
SERIAL_API bool SerialOpen(char *COMName,int iBaudRate)
{
DCB PortDCB;
COMMTIMEOUTS CommTimeouts;
BOOL fSuccess;
TCHAR *tCOMName=NULL;
if (bOnCollectingData)
{
bStopCollectingData=false;
return true;
}
tCOMName=(TCHAR*)malloc(10*sizeof(TCHAR));
MultiByteToWideChar(CP_UTF8,0,COMName,-1,tCOMName,10);//convert COMName to wide char
for (int i=0;i<MAX_HANDLER;i++)
{
SerialCallBack[i]=NULL;//initial function callback table
GPSCallBack[i]=NULL;//initial function GPS callback table
}
//MessageBox(NULL,tCOMName,L"111",MB_OK);
hPort=CreateFile(tCOMName,GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if (hPort==INVALID_HANDLE_VALUE)
{
CloseHandle(hPort);
return false;
}
else
{
//set comm event
fSuccess = SetCommMask(hPort, EV_RXCHAR);
if (!fSuccess)
{
return false;
}
o.hEvent = CreateEvent(
NULL, // default security attributes
FALSE, // auto reset event
FALSE, // not signaled
NULL // no name
);
// Intialize the rest of the OVERLAPPED structure to zero.
o.Internal = 0;
o.InternalHigh = 0;
o.Offset = 0;
o.OffsetHigh = 0;
//get current setting
GetCommState(hPort,&PortDCB);
//set dcb structure
PortDCB.DCBlength=sizeof(PortDCB);
PortDCB.BaudRate=iBaudRate;
PortDCB.Parity=NOPARITY;
PortDCB.StopBits=ONESTOPBIT;
PortDCB.ByteSize=8;
SetCommState(hPort,&PortDCB);
//set comm timeout
GetCommTimeouts(hPort,&CommTimeouts);
CommTimeouts.ReadIntervalTimeout=MAXDWORD;
CommTimeouts.ReadTotalTimeoutMultiplier=0;
CommTimeouts.ReadTotalTimeoutConstant=0;
CommTimeouts.WriteTotalTimeoutConstant=1000;
CommTimeouts.WriteTotalTimeoutMultiplier=10;
SetCommTimeouts(hPort,&CommTimeouts);
SerialRead();
return true;
}
if (tCOMName!=NULL)
{
free(tCOMName);
tCOMName=NULL;
}
}
SERIAL_API void SerialClose()
{
// TODO: Add your control notification handler code here
bStopCollectingData=true;
}
SERIAL_API void RegSerialCallBack(int HookNumber,voidfun regfunc)
{
SerialCallBack[HookNumber]=regfunc;
}
void CollectGPSBufferData(char ch)
{
if (chBufferSize>=100)
{
chBufferSize=0;
memset(chBuffer,0,100);
chPtr=chBuffer;
}
if (ch=='$' && bStringFinish)
{
chBufferSize=0;
memset(chBuffer,0,100);
chPtr=chBuffer;
memcpy(chPtr,&ch,1);
chPtr++;
bStringFinish=false;
chBufferSize++;
}
else if (!bStringFinish && ch=='\n')
{
bStringFinish=true;
memcpy(chPtr,&ch,1);
GPSParse((unsigned char *)chBuffer);
chBufferSize=0;
}
else if (!bStringFinish)
{
memcpy(chPtr,&ch,1);
chPtr++;
chBufferSize++;
}
}
DWORD WINAPI ReadThread(PVOID arg)
{
BOOL ReadStatus;
char ReadByte;
DWORD BytesRead;
int i;
while (!bFinish)
{
if (WaitCommEvent(hPort, &dwEvtMask, &o))
{
if (dwEvtMask & EV_RXCHAR)
{
if (hPort!=INVALID_HANDLE_VALUE)
{
ReadStatus=ReadFile(hPort,&ReadByte,1,&BytesRead,NULL);
if (bStopCollectingData) continue;
CollectGPSBufferData(ReadByte);
for (i=0;i<MAX_HANDLER;i++)
{
if (SerialCallBack[i]!=NULL)
SerialCallBack[i](ReadByte);
}
}
}
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -