nim_duilib/examples/proto_debuger/serial_port.cpp

254 lines
5.5 KiB
C++
Raw Normal View History

2021-09-20 23:46:15 +08:00
#include<tchar.h>
2021-09-20 22:37:32 +08:00
#include<iostream>
2021-09-20 23:46:15 +08:00
//#include<map>
#include <windows.h>
//using namespace std;
#include"serial_port.h"
2021-09-20 22:37:32 +08:00
2021-09-20 23:46:15 +08:00
map<int, HANDLE> SerialPort::ComMap;
//<2F><><EFBFBD><EFBFBD><ECBAAF>
2023-01-20 00:17:17 +08:00
SerialPort::SerialPort() {
}
2021-09-20 22:37:32 +08:00
2023-01-20 00:17:17 +08:00
//<2F><><EFBFBD><EFBFBD><ECBAAF>
2021-09-20 23:46:15 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2023-01-20 00:17:17 +08:00
SerialPort::~SerialPort() {
2021-09-20 22:37:32 +08:00
}
2021-09-20 23:46:15 +08:00
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
2023-01-20 00:17:17 +08:00
UINT SerialPort::GetPortNum(UINT** PortList) {
2021-09-20 23:46:15 +08:00
LPCTSTR Reg_Path = _T("HARDWARE\\DEVICEMAP\\SERIALCOMM"); //<2F><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
2023-01-20 00:17:17 +08:00
//TCHAR pnum[8];
2021-09-20 23:46:15 +08:00
HKEY H_Key;
static UINT portlist[255]; //һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>255<35><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9B9BB><EFBFBD>ˡ<EFBFBD>
long Status;
UINT PortNum;
DWORD count = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD Com_Length, Type_Length, Type;
TCHAR Com_Name[256];//<2F><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TCHAR Type_Name[256];//<2F><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, Reg_Path, 0, KEY_READ, &H_Key); //<2F><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>long
memset(portlist, 0, sizeof(portlist)); // <20><>0
if (Status) //<2F><><EFBFBD><EFBFBD>ֵΪ0<CEAA><30>ʾ<EFBFBD>򿪳ɹ<F2BFAAB3><C9B9><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
2021-09-20 22:37:32 +08:00
{
2021-09-20 23:46:15 +08:00
return 0;
2021-09-20 22:37:32 +08:00
}
2021-09-20 23:46:15 +08:00
2023-01-20 00:17:17 +08:00
while (true) {
2021-09-20 23:46:15 +08:00
Com_Length = 256; //<2F><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>ÿ<EFBFBD>ζ<EFBFBD>Ҫ<EFBFBD><D2AA>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>Ȼ<EFBFBD>´ο<C2B4><CEBF>ܻ<EFBFBD>ʧ<EFBFBD><CAA7>,Com_lengthֵ<68><D6B5><EFBFBD><EFBFBD>
Type_Length = 256;
PortNum = 0;
Status = RegEnumValue(H_Key, count++, Type_Name, &Type_Length
, 0, &Type, PUCHAR(Com_Name), &Com_Length);
2023-01-20 00:17:17 +08:00
if (Status) { //<2F><>ѯʧ<D1AF><CAA7>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>
2021-09-20 23:46:15 +08:00
break;
}
2023-01-20 00:17:17 +08:00
for (int i = 3; Com_Name[i]; i++) { //ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
2021-09-20 23:46:15 +08:00
PortNum = PortNum * 10 + (Com_Name[i] - '0');
}
portlist[count - 1] = PortNum;
2021-09-20 22:37:32 +08:00
}
2021-09-20 23:46:15 +08:00
*PortList = portlist; //<2F>ض<EFBFBD><D8B6><EFBFBD>ָ<EFBFBD><D6B8>
return (count - 1);
}
//_stprintf_s(DcbPara, _T("baud=%d parity=%c data=%d stop=%d"), 9600, 'N', 8, 1);
//<2F>򿪶˿<F2BFAAB6>
HANDLE SerialPort::OpenPort(UINT PortNo) //<2F>򿪶˿<F2BFAAB6>
{
HANDLE H_Com; //<2F><><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
//PortNum = PortNo; //<2F><><EFBFBD>ں<EFBFBD>
TCHAR PortName[20];
//<2F><><EFBFBD><EFBFBD><EFBFBD>ںŴ<DABA>ӡ<EFBFBD><D3A1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>10<31><30><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>
_stprintf_s(PortName, _T("\\\\.\\COM%d"), PortNo);
H_Com = CreateFile(PortName,
GENERIC_READ | GENERIC_WRITE,//<2F><>д
0,
NULL,
OPEN_EXISTING, //<2F>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ڵ<EFBFBD>
0,
0); //<2F>򿪴<EFBFBD><F2BFAAB4>ڣ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>ʽ
2023-01-20 00:17:17 +08:00
if (H_Com == INVALID_HANDLE_VALUE) {//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ʧ<EFBFBD><CAA7>
2021-09-20 23:46:15 +08:00
return INVALID_HANDLE_VALUE;
2021-09-20 22:37:32 +08:00
}
2021-09-20 23:46:15 +08:00
SetupComm(H_Com, 1024, 1024); //<2F><><EFBFBD>ö<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1024;
ComMap[PortNo] = H_Com; // <20>򿪳ɹ<F2BFAAB3><C9B9>򣬴<EFBFBD><F2A3ACB4><EFBFBD>map
return H_Com;
}
2023-01-20 00:17:17 +08:00
2021-09-20 23:46:15 +08:00
//<2F>رն˿<D5B6>
void SerialPort::ClosePort(UINT PortNo) //<2F>رմ<D8B1><D5B4><EFBFBD>
{
if (PortState(PortNo)) //<2F><><EFBFBD><EFBFBD><EFBFBD>Ǵ򿪵<C7B4>
2021-09-20 22:37:32 +08:00
{
2021-09-20 23:46:15 +08:00
HANDLE H_Com = ComMap[PortNo]; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
CloseHandle(H_Com);
ComMap.erase(PortNo); //<2F><>map<61><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2021-09-20 22:37:32 +08:00
}
2021-09-20 23:46:15 +08:00
}
2021-09-20 22:37:32 +08:00
2021-09-20 23:46:15 +08:00
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD>ж˿<D0B6>
2023-01-20 00:17:17 +08:00
void SerialPort::ClearAllPort() { //<2F>رմ<D8B1><D5B4><EFBFBD>
2021-09-20 23:46:15 +08:00
for (map<int, HANDLE>::iterator iter = ComMap.begin(); iter != ComMap.end(); )
2021-09-20 22:37:32 +08:00
{
2021-09-20 23:46:15 +08:00
CloseHandle(iter->second); //<2F>رմ<D8B1><D5B4><EFBFBD>
iter = ComMap.erase(iter); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧЧ<CAA7><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB3A3>
2021-09-20 22:37:32 +08:00
}
2021-09-20 23:46:15 +08:00
}
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2023-01-20 00:17:17 +08:00
int SerialPort::InitPort(UINT PortNo, UINT Baud, byte Parity, byte Data, byte Stop) {
2021-09-20 23:46:15 +08:00
if (PortState(PortNo)) //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
2021-09-20 22:37:32 +08:00
{
2021-09-20 23:46:15 +08:00
ClosePort(PortNo); //<2F>ص<EFBFBD><D8B5>˿<EFBFBD>
2021-09-20 22:37:32 +08:00
}
2021-09-20 23:46:15 +08:00
if (Parity < 0 || Parity >4) //parity 0~4
return 0;
if (Stop < 0 || Stop >2) //stop 0~2
return 0;
HANDLE H_Com; //<2F><><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
//TCHAR DcbPara[50]; //<2F><><EFBFBD><EFBFBD>Dcb<63>
//_stprintf_s(DcbPara, _T("baud=%d parity=%c data=%d stop=%d") , Baud, Parity, Data, Stop);
H_Com = OpenPort(PortNo);
2023-01-20 00:17:17 +08:00
if (H_Com == INVALID_HANDLE_VALUE) {
2021-09-20 23:46:15 +08:00
return 0;
2021-09-20 22:37:32 +08:00
}
2021-09-20 23:46:15 +08:00
//int count = 0;
2021-09-26 00:43:37 +08:00
COMMTIMEOUTS ComTimeouts = { 0, 0, 10, 0, 10 };
2021-09-20 23:46:15 +08:00
DCB S_dcb;
2023-01-20 00:17:17 +08:00
if (!SetCommTimeouts(H_Com, &ComTimeouts)) {//<2F><><EFBFBD>ó<EFBFBD>ʱ
2021-09-20 23:46:15 +08:00
return 0;
}
2023-01-20 00:17:17 +08:00
if (!GetCommState(H_Com, &S_dcb)) { //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>DCB<43>
2021-09-20 23:46:15 +08:00
return 0;
}
S_dcb.BaudRate = Baud;
S_dcb.ByteSize = Data;
S_dcb.Parity = Parity;
S_dcb.StopBits = Stop;
//if(!BuildCommDCB(DcbPara , &S_dcb))//<2F><><EFBFBD><EFBFBD>DCB
//{
2021-09-20 22:37:32 +08:00
2021-09-20 23:46:15 +08:00
// return 0;
//}
2021-09-20 22:37:32 +08:00
2021-09-26 00:43:37 +08:00
S_dcb.fRtsControl = RTS_CONTROL_DISABLE; //<2F><><EFBFBD><EFBFBD>Rts<74>ź<EFBFBD>
2023-01-20 00:17:17 +08:00
if (!SetCommState(H_Com, &S_dcb)) { //<2F><><EFBFBD><EFBFBD>DCB
2021-09-20 23:46:15 +08:00
int i = GetLastError();
return 0;
2021-09-20 22:37:32 +08:00
}
2021-09-20 23:46:15 +08:00
PurgeComm(H_Com, PURGE_RXCLEAR | PURGE_TXCLEAR |
PURGE_RXABORT | PURGE_TXABORT); //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
return 1;
}
2021-09-22 00:01:02 +08:00
2021-09-20 23:46:15 +08:00
int SerialPort::PortState(UINT PortNo)
{
map<int, HANDLE>::iterator iter;
iter = ComMap.find(PortNo);
if (iter != ComMap.end()) //˵<><CBB5><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>˶˿<CBB6>
return 1;
2021-09-20 22:37:32 +08:00
else
2021-09-20 23:46:15 +08:00
return 0;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int SerialPort::ReadPort(UINT PortNo, char* P_recved, int length) //<2F><><EFBFBD>غ<EFBFBD><D8BA><EFBFBD> һ<>ζ<EFBFBD>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>
{
if (PortState(PortNo) == 0) //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
return 0;
HANDLE H_Com = ComMap[PortNo];
DWORD Recn; //ʵ<>ʶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
BOOL Result = TRUE;
Result = ReadFile(H_Com, P_recved, length, &Recn, NULL);
if (Result == 0)
2021-09-20 22:37:32 +08:00
{
2021-09-20 23:46:15 +08:00
//GetLastError();
PurgeComm(H_Com, PURGE_RXCLEAR | PURGE_RXABORT);
return 0;
2021-09-20 22:37:32 +08:00
}
2021-09-20 23:46:15 +08:00
return Recn;
}
//<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
void SerialPort::ClearCom(UINT PortNo)
{
if (PortState(PortNo) == 0) //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
return;
HANDLE H_Com = ComMap[PortNo];
PurgeComm(H_Com, PURGE_RXCLEAR | PURGE_RXABORT);
}
int SerialPort::CheckRTS(UINT PortNo)
{
return 0;
}
//д<><D0B4><EFBFBD><EFBFBD>
int SerialPort::WritePort(UINT PortNo, const char* pData, int length)
2021-09-20 22:37:32 +08:00
{
2021-09-20 23:46:15 +08:00
if (PortState(PortNo) == 0) //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
return 0;
HANDLE H_Com = ComMap[PortNo];
if (length == 0)
length = strlen(pData);
DWORD Recn;
BOOL Result = TRUE;
if (H_Com == INVALID_HANDLE_VALUE)
return -1;
Result = WriteFile(H_Com, pData, length, &Recn, NULL);
if (Result == 0)
2021-09-20 22:37:32 +08:00
{
2021-09-20 23:46:15 +08:00
GetLastError();
PurgeComm(H_Com, PURGE_RXCLEAR | PURGE_RXABORT);
return 0;
2021-09-20 22:37:32 +08:00
}
2023-01-20 00:17:17 +08:00
return Recn;
}
2021-09-20 23:46:15 +08:00
//<2F><>ȡҪ<C8A1><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
UINT SerialPort::GetByte(UINT PortNo) //<2F>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڳ<D6BD><DAB3>ȡ<EFBFBD>
{
if (PortState(PortNo) == 0) //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
return 0;
HANDLE H_Com = ComMap[PortNo];
DWORD dwError;
COMSTAT comstat;
DWORD BytesInQue = 0;
DWORD FirstSize = 0;
memset(&comstat, 0, sizeof(COMSTAT)); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (true)
2021-09-20 22:37:32 +08:00
{
2021-09-20 23:46:15 +08:00
BytesInQue = FirstSize;
Sleep(10);
if (ClearCommError(H_Com, &dwError, &comstat))
FirstSize = comstat.cbInQue; //<2F><><EFBFBD>¸<EFBFBD>ֵ
if (BytesInQue == FirstSize)
break;
2021-09-20 22:37:32 +08:00
}
2021-09-20 23:46:15 +08:00
return BytesInQue;
2021-09-20 22:37:32 +08:00
}