nim_duilib/examples/proto_debuger/serial_port.cpp

252 lines
5.8 KiB
C++
Raw Normal View History

2021-09-20 22:37:32 +08:00
#include "serial_port.h"
#include <stdio.h>
#include <string.h>
#include <WinSock2.h>
#include <windows.h>
#include<iostream>
using namespace std;
SerialPort::SerialPort()
{
}
SerialPort::~SerialPort()
{
}
bool SerialPort::open(const char* portname,
int baudrate,
char parity,
char databit,
char stopbit,
char synchronizeflag)
{
this->synchronizeflag = synchronizeflag;
HANDLE hCom = NULL;
if (this->synchronizeflag)
{
//ͬ<><CDAC><EFBFBD><EFBFBD>ʽ
hCom = CreateFileA(portname, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GENERIC_READ | GENERIC_WRITE, //֧<>ֶ<EFBFBD>д
0, //<2F><>ռ<EFBFBD><D5BC>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>֧<EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>
NULL,//<2F><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>ָ<EFBFBD>룬Ĭ<EBA3AC><C4AC>ֵΪNULL
OPEN_EXISTING, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĴ<D0B5><C4B4><EFBFBD><EFBFBD>ļ<EFBFBD>
0, //0<><30>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>FILE_FLAG_OVERLAPPED<45><44><EFBFBD><EFBFBD><ECB2BD>ʽ
NULL);//<2F><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ֵΪNULL<4C><4C><EFBFBD>Դ<EFBFBD><D4B4>ڶ<EFBFBD><DAB6>Ըò<D4B8><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪNULL
}
else
{
//<2F><EFBFBD><ECB2BD>ʽ
hCom = CreateFileA(portname, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GENERIC_READ | GENERIC_WRITE, //֧<>ֶ<EFBFBD>д
0, //<2F><>ռ<EFBFBD><D5BC>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>֧<EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>
NULL,//<2F><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>ָ<EFBFBD>룬Ĭ<EBA3AC><C4AC>ֵΪNULL
OPEN_EXISTING, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĴ<D0B5><C4B4><EFBFBD><EFBFBD>ļ<EFBFBD>
FILE_FLAG_OVERLAPPED, //0<><30>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>FILE_FLAG_OVERLAPPED<45><44><EFBFBD><EFBFBD><ECB2BD>ʽ
NULL);//<2F><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ֵΪNULL<4C><4C><EFBFBD>Դ<EFBFBD><D4B4>ڶ<EFBFBD><DAB6>Ըò<D4B8><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪNULL
}
if (hCom == (HANDLE)-1)
{
return false;
}
//<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
if (!SetupComm(hCom, 1024, 1024))
{
return false;
}
// <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
DCB p;
memset(&p, 0, sizeof(p));
p.DCBlength = sizeof(p);
p.BaudRate = baudrate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
p.ByteSize = databit; // <20><><EFBFBD><EFBFBD>λ
switch (parity) //У<><D0A3>λ
{
case 0:
p.Parity = NOPARITY; //<2F><>У<EFBFBD><D0A3>
break;
case 1:
p.Parity = ODDPARITY; //<2F><>У<EFBFBD><D0A3>
break;
case 2:
p.Parity = EVENPARITY; //żУ<C5BC><D0A3>
break;
case 3:
p.Parity = MARKPARITY; //<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
break;
}
switch (stopbit) //ֹͣλ
{
case 1:
p.StopBits = ONESTOPBIT; //1λֹͣλ
break;
case 2:
p.StopBits = TWOSTOPBITS; //2λֹͣλ
break;
case 3:
p.StopBits = ONE5STOPBITS; //1.5λֹͣλ
break;
}
if (!SetCommState(hCom, &p))
{
// <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ʧ<EFBFBD><CAA7>
return false;
}
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>,<2C><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ܳ<EFBFBD>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4B3A3>
COMMTIMEOUTS TimeOuts;
TimeOuts.ReadIntervalTimeout = 1000; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
TimeOuts.ReadTotalTimeoutMultiplier = 500; //<2F><>ʱ<EFBFBD><CAB1>ϵ<EFBFBD><CFB5>
TimeOuts.ReadTotalTimeoutConstant = 5000; //<2F><>ʱ<EFBFBD><EFBFBD><E4B3A3>
TimeOuts.WriteTotalTimeoutMultiplier = 500; // дʱ<D0B4><CAB1>ϵ<EFBFBD><CFB5>
TimeOuts.WriteTotalTimeoutConstant = 2000; //дʱ<D0B4><EFBFBD><E4B3A3>
SetCommTimeouts(hCom, &TimeOuts);
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);//<2F><><EFBFBD>մ<EFBFBD><D5B4>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>
memcpy(pHandle, &hCom, sizeof(hCom));// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return true;
}
void SerialPort::close()
{
HANDLE hCom = *(HANDLE*)pHandle;
CloseHandle(hCom);
}
int SerialPort::send(string dat)
{
HANDLE hCom = *(HANDLE*)pHandle;
if (this->synchronizeflag)
{
// ͬ<><CDAC><EFBFBD><EFBFBD>ʽ
DWORD dwBytesWrite = dat.length(); //<2F>ɹ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
BOOL bWriteStat = WriteFile(hCom, //<2F><><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
(char*)dat.c_str(), //<2F><><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
dwBytesWrite, //Ҫ<><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
&dwBytesWrite, //DWORD*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7>سɹ<D8B3><C9B9><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
NULL); //NULLΪͬ<CEAA><CDAC><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>OVERLAPPED*Ϊ<><EFBFBD><ECB2BD><EFBFBD><EFBFBD>
if (!bWriteStat)
{
return 0;
}
return dwBytesWrite;
}
else
{
//<2F><EFBFBD><ECB2BD>ʽ
DWORD dwBytesWrite = dat.length(); //<2F>ɹ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
DWORD dwErrorFlags; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
COMSTAT comStat; //ͨѶ״̬
OVERLAPPED m_osWrite; //<2F><EFBFBD><ECB2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9>
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OVERLAPPED<45><44><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ϵͳҪ<CDB3><D2AA><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>
memset(&m_osWrite, 0, sizeof(m_osWrite));
m_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, L"WriteEvent");
ClearCommError(hCom, &dwErrorFlags, &comStat); //<2F><><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD>󣬻<EFBFBD><F3A3ACBB><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ǰ״̬
BOOL bWriteStat = WriteFile(hCom, //<2F><><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
(char*)dat.c_str(), //<2F><><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
dwBytesWrite, //Ҫ<><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
&dwBytesWrite, //DWORD*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7>سɹ<D8B3><C9B9><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
&m_osWrite); //NULLΪͬ<CEAA><CDAC><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>OVERLAPPED*Ϊ<><EFBFBD><ECB2BD><EFBFBD><EFBFBD>
if (!bWriteStat)
{
if (GetLastError() == ERROR_IO_PENDING) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
{
WaitForSingleObject(m_osWrite.hEvent, 1000); //<2F>ȴ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>¼<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
}
else
{
ClearCommError(hCom, &dwErrorFlags, &comStat); //<2F><><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
CloseHandle(m_osWrite.hEvent); //<2F>رղ<D8B1><D5B2>ͷ<EFBFBD>hEvent<6E>ڴ<EFBFBD>
return 0;
}
}
return dwBytesWrite;
}
}
string SerialPort::receive()
{
HANDLE hCom = *(HANDLE*)pHandle;
string rec_str = "";
char buf[1024];
if (this->synchronizeflag)
{
//ͬ<><CDAC><EFBFBD><EFBFBD>ʽ
DWORD wCount = 1024; //<2F>ɹ<EFBFBD><C9B9><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
BOOL bReadStat = ReadFile(hCom, //<2F><><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
buf, //<2F><><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
wCount, //Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
&wCount, //DWORD*,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7>سɹ<D8B3><C9B9><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
NULL); //NULLΪͬ<CEAA><CDAC><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>OVERLAPPED*Ϊ<><EFBFBD><ECB2BD><EFBFBD><EFBFBD>
for (int i = 0; i < 1024; i++)
{
if (buf[i] != -52)
rec_str += buf[i];
else
break;
}
return rec_str;
}
else
{
//<2F><EFBFBD><ECB2BD>ʽ
DWORD wCount = 1024; //<2F>ɹ<EFBFBD><C9B9><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
DWORD dwErrorFlags; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
COMSTAT comStat; //ͨѶ״̬
OVERLAPPED m_osRead; //<2F><EFBFBD><ECB2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9>
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OVERLAPPED<45><44><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ϵͳҪ<CDB3><D2AA><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>
memset(&m_osRead, 0, sizeof(m_osRead));
m_osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, L"ReadEvent");
ClearCommError(hCom, &dwErrorFlags, &comStat); //<2F><><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD>󣬻<EFBFBD><F3A3ACBB><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ǰ״̬
if (!comStat.cbInQue)return 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>Ϊ0<CEAA><30><EFBFBD>򷵻<EFBFBD>false
//std::cout << comStat.cbInQue << std::endl;
BOOL bReadStat = ReadFile(hCom, //<2F><><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
buf, //<2F><><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
wCount, //Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
&wCount, //DWORD*,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7>سɹ<D8B3><C9B9><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
&m_osRead); //NULLΪͬ<CEAA><CDAC><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>OVERLAPPED*Ϊ<><EFBFBD><ECB2BD><EFBFBD><EFBFBD>
if (!bReadStat)
{
if (GetLastError() == ERROR_IO_PENDING) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>ȡ<EFBFBD><C8A1>
{
//GetOverlappedResult<6C><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪTRUE
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һֱ<D2BB>ȴ<EFBFBD><C8B4><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD><C9BB><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GetOverlappedResult(hCom, &m_osRead, &wCount, TRUE);
}
else
{
ClearCommError(hCom, &dwErrorFlags, &comStat); //<2F><><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
CloseHandle(m_osRead.hEvent); //<2F>رղ<D8B1><D5B2>ͷ<EFBFBD>hEvent<6E><74><EFBFBD>ڴ<EFBFBD>
return 0;
}
}
for (int i = 0; i < 1024; i++)
{
if (buf[i] != -52)
rec_str += buf[i];
else
break;
}
return rec_str;
}
}