1 Star 0 Fork 2

liyang/JointSerial01

forked from TMRNic/JointSerial01 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
SerialThreadManager.cpp 7.82 KB
一键复制 编辑 原始数据 按行查看 历史
TMRNic 提交于 2021-07-15 23:13 +08:00 . 功能优化:
#include "pch.h"
#include "SerialThreadManager.h"
SerialThreadManager::SerialThreadManager(HWND mainWin)
{
threadon[0] = FALSE;
threadon[1] = FALSE;
threadon[2] = FALSE;
threadon[3] = FALSE;
threadon[4] = FALSE;
mainWIN = mainWin; // 复制主窗口
hdtimer = new HDTIMER();
lppara[0].mainWIN = &(this->mainWIN);
lppara[1].mainWIN = &(this->mainWIN);
lppara[2].mainWIN = &(this->mainWIN);
lppara[3].mainWIN = &(this->mainWIN);
lppara[4].mainWIN = &(this->mainWIN);
lppara[0].threadon = &threadon[0];
lppara[1].threadon = &threadon[1];
lppara[2].threadon = &threadon[2];
lppara[3].threadon = &threadon[3];
lppara[4].threadon = &threadon[4];
lppara[0].HDTimer = hdtimer;
lppara[1].HDTimer = hdtimer;
lppara[2].HDTimer = hdtimer;
lppara[3].HDTimer = hdtimer;
lppara[4].HDTimer = hdtimer;
hdtimer->HRTinit();
}
void SerialThreadManager::startSel()
{
for (size_t i = 0; i < 5; i++)
{
if (sel[i])
{
startComm(i);
}
}
}
void SerialThreadManager::startComm(int commk)
{
switch (commk)
{
case 0:
thdMINS = CreateThread(NULL, 0, commProcMINS, (void*)&lppara[0], THREAD_PRIORITY_HIGHEST, 0);
break;
case 1:
thdSINS = CreateThread(NULL, 0, commProcSINS, (void*)&lppara[1], THREAD_PRIORITY_ABOVE_NORMAL, 0);
break;
case 2:
thdGNSS = CreateThread(NULL, 0, commProcGNSS, (void*)&lppara[2], THREAD_PRIORITY_NORMAL, 0);
break;
case 3:
thdPDE = CreateThread(NULL, 0, commProcPDE, (void*)&lppara[3], THREAD_PRIORITY_NORMAL, 0);
break;
case 4:
thdRTK = CreateThread(NULL, 0, commProcRTK, (void*)&lppara[4], THREAD_PRIORITY_NORMAL, 0);
break;
default:
break;
}
}
/* Invalid Function */
void SerialThreadManager::stopSel()
{
for (size_t i = 0; i < 5; i++)
{
if (sel[i])
{
stopComm(i);
}
}
}
void SerialThreadManager::stopComm(int commk)
{
threadon[commk] = FALSE;
}
// 1 打开串口, 2 进入循环, 3 传递消息
DWORD __stdcall SerialThreadManager::commProcMINS(LPVOID lpvoid)
{
BOOL* threadon = ((THDPARA*)lpvoid)->threadon;
SerialThread* ST = ((THDPARA*)lpvoid)->ST;
HWND* mainWIN = ((THDPARA*)lpvoid)->mainWIN;
HDTIMER* timer = ((THDPARA*)lpvoid)->HDTimer;
if (ST->openPort() == FALSE)
{
*threadon = FALSE; // 串口打开失败 关闭线程
SendMessage(*mainWIN, THREAD_ERR_NOP, 0, NULL);
return 0;
}
while (TRUE)
{
if (*threadon)
{
if (ST->findHead())
{
timer->getDHT();
SendMessage(*mainWIN, THREAD_GET_MID, (WPARAM)(timer->timercnt), NULL);
}
}
else
{
ST->closePort();
ExitThread(0);
}
}
return 0;
}
DWORD __stdcall SerialThreadManager::commProcSINS(LPVOID lpvoid)
{
BOOL* threadon = ((THDPARA*)lpvoid)->threadon;
SerialThread* ST = ((THDPARA*)lpvoid)->ST;
HWND* mainWIN = ((THDPARA*)lpvoid)->mainWIN;
HDTIMER* timer = ((THDPARA*)lpvoid)->HDTimer;
if (ST->openPort() == FALSE)
{
*threadon = FALSE; // 串口打开失败 关闭线程
SendMessage(*mainWIN, THREAD_ERR_NOP, 1, NULL);
return 0;
}
else
while (TRUE)
{
if (*threadon)
{
if (ST->findHead())
{
timer->getDHT();
SendMessage(*mainWIN, THREAD_GET_SID, (WPARAM)(timer->timercnt), NULL);
}
}
else
{
ST->closePort();
ExitThread(0);
}
}
return 0;
}
DWORD __stdcall SerialThreadManager::commProcGNSS(LPVOID lpvoid)
{
BOOL* threadon = ((THDPARA*)lpvoid)->threadon;
SerialThread* ST = ((THDPARA*)lpvoid)->ST;
HWND* mainWIN = ((THDPARA*)lpvoid)->mainWIN;
HDTIMER* timer = ((THDPARA*)lpvoid)->HDTimer;
if (ST->openPort() == FALSE)
{
*threadon = FALSE; // 串口打开失败 关闭线程
SendMessage(*mainWIN, THREAD_ERR_NOP, 2, NULL);
return 0;
}
ST->sendReceiverCMD();
while (TRUE)
{
if (*threadon)
{
if (ST->findGNSSHead())
{
if (ST->getHead[0] == TRUE || ST->getHead[2] == TRUE) // GPGGA与GNGGA都是位置信息
{
timer->getDHT();
SendMessage(*mainWIN, THREAD_GET_GPO, (WPARAM)(timer->timercnt), NULL);
}
else
SendMessage(*mainWIN, THREAD_GET_GVE, 2, NULL);
}
}
else
{
ST->closePort();
ExitThread(0);
}
}
return 0;
}
DWORD __stdcall SerialThreadManager::commProcPDE(LPVOID lpvoid)
{
BOOL* threadon = ((THDPARA*)lpvoid)->threadon;
SerialThread* ST = ((THDPARA*)lpvoid)->ST;
HWND* mainWIN = ((THDPARA*)lpvoid)->mainWIN;
HDTIMER* timer = ((THDPARA*)lpvoid)->HDTimer;
if (ST->openPort() == FALSE)
{
*threadon = FALSE; // 串口打开失败 关闭线程
SendMessage(*mainWIN, THREAD_ERR_NOP, 3, NULL);
return 0;
}
ST->sendReceiverCMD();
while (TRUE)
{
if (*threadon)
{
if (ST->findGNSSHead())
{
if (ST->getHead[0] == TRUE)
{
timer->getDHT();
SendMessage(*mainWIN, THREAD_GET_PPR, (WPARAM)(timer->timercnt), NULL);
}
else if (ST->getHead[1] == TRUE)
SendMessage(*mainWIN, THREAD_GET_PSP, 3, NULL);
else
SendMessage(*mainWIN, THREAD_GET_PEP, 3, NULL);
}
}
else
{
ST->closePort();
ExitThread(0);
}
}
return 0;
}
DWORD __stdcall SerialThreadManager::commProcRTK(LPVOID lpvoid)
{
BOOL* threadon = ((THDPARA*)lpvoid)->threadon;
SerialThread* ST = ((THDPARA*)lpvoid)->ST;
HWND* mainWIN = ((THDPARA*)lpvoid)->mainWIN;
HDTIMER* timer = ((THDPARA*)lpvoid)->HDTimer;
if (ST->openPort() == FALSE)
{
*threadon = FALSE; // 串口打开失败 关闭线程
SendMessage(*mainWIN, THREAD_ERR_NOP, 4, NULL);
return 0;
}
ST->sendReceiverCMD(); // 发送接收机初始化指令
while (TRUE)
{
if (*threadon)
{
if (ST->findGNSSHead())
{
if (ST->getHead[0] == TRUE || ST->getHead[2] == TRUE) // GPGGA与GNGGA都是位置信息
{
timer->getDHT();
SendMessage(*mainWIN, THREAD_GET_RPO, (WPARAM)(timer->timercnt), NULL);
}
else
SendMessage(*mainWIN, THREAD_GET_RVE, 4, NULL);
}
}
else
{
ST->closePort();
ExitThread(0);
}
}
return 0;
}
/********************************************************************/
/* HRTimer 初始化 */
/********************************************************************/
void HDTIMER::HRTinit()
{
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&StartingTime);
}
/********************************************************************/
/* 获取HRT时间 */
/********************************************************************/
UINT HDTIMER::getDHT()
{
QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
timercnt = ElapsedMicroseconds.QuadPart * 1000 / Frequency.QuadPart;
return timercnt;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/iYang_GNSS/joint-serial01.git
git@gitee.com:iYang_GNSS/joint-serial01.git
iYang_GNSS
joint-serial01
JointSerial01
master

搜索帮助