|
发表于 2018-11-15 09:23:55
|
显示全部楼层
VB看起来不舒服还是C好看。
#include "stdafx.h"
#include "SerialPort.h"
using namespace std;
//CSerialPort
CSerialPort::CSerialPort()
{
m_RunThead = false;
}
CSerialPort::~CSerialPort()
{
}
//'设置串口通讯参数
bool CSerialPort::SetCommParam(int lBaudRate, int cByteSize, int cStopBits, int cParity, int cEOFChar) {
DCB dc;
bool flag = false;
if (GetCommState(m_HANDLE, &dc) != NULL) {
;
dc.BaudRate = lBaudRate;
dc.ByteSize = cByteSize;
dc.StopBits = cStopBits;
dc.Parity = cParity;
dc.EofChar = cEOFChar; //EofChar
flag = SetCommState(m_HANDLE, &dc);
}
return flag;
}
HANDLE CSerialPort::OpenCOM(unsigned char lComPort, int lBaudRate, int cByteSize, int cStopBits, int cParity, int cEOFChar) {
char strcom[30];
sprintf(strcom, "\\\\.\\com%d", lComPort);
m_HANDLE = CreateFile(strcom, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, /*FILE_FLAG_OVERLAPPED*/0, 0);//
if (m_HANDLE != INVALID_HANDLE_VALUE) {
SetCommTimeOut();//'设置超时
SetCommBuffer(); //' 8, 8 '设置读、写缓冲区大小
SetCommParam(lBaudRate, cByteSize, cStopBits, cParity, cEOFChar);
}
return m_HANDLE;
}
//'设置串口超时
bool CSerialPort::SetCommTimeOut(int dwReadTimeOut, int dwWriteTimeOut) {
COMMTIMEOUTS ct;
ct.ReadIntervalTimeout = 1;// dwReadTimeOut;// '读操作时,字符间超时 MAXDWORD
ct.ReadTotalTimeoutMultiplier = 1;// 30;// dwReadTimeOut;// '读操作时,每字节超时
ct.ReadTotalTimeoutConstant = 1;// 30;// dwReadTimeOut;// '读操作时,固定超时(总超时 = 每字节超时*字节数 + 固定超时)
ct.WriteTotalTimeoutMultiplier = dwWriteTimeOut; //'写操作时,每字节超时
ct.WriteTotalTimeoutConstant = dwWriteTimeOut; //'写操作时,固定超时(总超时=每字节超时*字节数+固定超时)
return (SetCommTimeouts(m_HANDLE, &ct));
}
//'设置串口读写缓冲区大小
bool CSerialPort::SetCommBuffer(int dwBytesRead, int dwBytesWrite) {
if (m_HANDLE == NULL) return false;
return SetupComm(m_HANDLE, dwBytesRead, dwBytesWrite);
}
// '清空串口缓冲区
void CSerialPort::ClearComm(bool InBuffer, bool OutBuffer) {
if (InBuffer == true) PurgeComm(m_HANDLE, PURGE_RXABORT | PURGE_RXCLEAR); // '清空输入缓冲区
if (OutBuffer == true) PurgeComm(m_HANDLE, PURGE_TXABORT | PURGE_TXCLEAR); //'清空输出缓冲区
}
//'关闭串口
void CSerialPort::CloseComm(void) {
ClearComm();
CloseHandle(m_HANDLE);
}
//'读串口
int CSerialPort::ReadComm(BYTE *BytesBuffer, DWORD bufferLong) {
DWORD dwBytesRead = 0;
//DWORD dwErrorFlags;
//COMSTAT ComStat;
//OVERLAPPED m_osRead;
//ClearCommError(m_HANDLE, &dwErrorFlags, &ComStat);
ClearComm(true, false);
ReadFile(m_HANDLE, BytesBuffer, bufferLong, &dwBytesRead, /*&m_ov*/0);
return dwBytesRead;
}
//'写串口
int CSerialPort::WriteComm(BYTE *BytesBuffer, int byteLong) {
DWORD dwBytesWrite;
ClearComm(false, true);
WriteFile(m_HANDLE, BytesBuffer, byteLong, &dwBytesWrite, /*&m_ov*/0);
return dwBytesWrite;
}
HANDLE CSerialPort::StartThread() {
m_Thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)this->CommThread, this, 0, NULL);
//m_Thread = (HANDLE)_beginthread((void(__cdecl *) (void *))CommThread, 0, this);
return m_Thread;
}
bool CSerialPort::RestartThread()
{
ResumeThread(m_Thread);
return TRUE;
}
//
// Suspend the comm thread
//
bool CSerialPort::StopThread() {
SuspendThread(m_Thread);
return TRUE;
}
BOOL CSerialPort::CloseThread() {
m_RunThead = true;
// Sleep(100);
CloseHandle(m_Thread);
return true;
}
int CSerialPort::GetSerialTXDdata(CSerialPort *port,BYTE *buf,int cnt) {
memcpy(buf, port->m_RXDbuf, cnt);
return cnt;
}
void CSerialPort::GetCommPortInfo(COMM_PORT_DATA *portinfo, unsigned char id) {
portinfo->name = id;
portinfo->index = 0;
for (int i = 0; i<15; i++) portinfo->Adr[i] = 10 + i;
portinfo->addrCnt = 10;
portinfo->nFrame = 2;
portinfo->CurFrame = 0;
} |
|