📄 com_control.cpp
字号:
#include "COM_control.h"
_COM::_COM()
{
hCreate = NULL;
Success = 0;
SendEvent.SetEvent();
RecvEvent.SetEvent();
memset(&SendOV,0,sizeof(SendOV)); //发送
SendOV.hEvent=SendEvent;
memset(&RecvOV,0,sizeof(RecvOV)); //接收
RecvOV.hEvent=RecvEvent;
RecvPTR=0;
}
_COM::~_COM()
{
//delete []ReadData;
}
int _COM::ComInitial( char * ComName)
{
DCB dcb;
char *SerialPort = ComName;
int BaudRate = 9600;
// 打开串口文件//FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED
hCreate = CreateFile( SerialPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL );
if( hCreate == INVALID_HANDLE_VALUE )
{
cerr<<"Initial中创建串口出错,错误原因是" <<GetLastError() <<endl;
return 1; // 错误,返回
}
Success = GetCommState( hCreate,&dcb );
if( !Success )
{
cerr<<"Initial中获得串口状态出错,错误原因是" <<GetLastError() <<endl;
return 2; // 错误,返回
}
// 设置串口状态
dcb.BaudRate = BaudRate; // 波特率外部制定
dcb.ByteSize = 8; // 8位数据
dcb.StopBits = ONESTOPBIT; // 1位停止位
dcb.Parity = NOPARITY; // 无奇偶校验
Success = SetCommState( hCreate,&dcb );
if( !Success )
{
cerr<<"Initial中设置串口状态出错,错误原因是" <<GetLastError() <<endl;
return 3; // 错误,返回
}
// 设置超时时间
COMMTIMEOUTS TimeSet;
memset( &TimeSet,0,sizeof(TimeSet) );
TimeSet.ReadIntervalTimeout = 100;
TimeSet.ReadTotalTimeoutConstant = 1;
TimeSet.ReadTotalTimeoutMultiplier = 500;
TimeSet.WriteTotalTimeoutConstant = 1;
TimeSet.WriteTotalTimeoutMultiplier = 100;
Success = SetCommTimeouts(hCreate, &TimeSet);
if( !Success )
{
cerr<<"Initial中设置超时时间出错,错误原因是" <<GetLastError() <<endl;
return 4; // 错误,返回
}
Success = SetupComm( hCreate,BUFFER_SIZE,BUFFER_SIZE );
if( !Success )
{
cerr<<"Initial中设置缓冲区出错,错误原因是" <<GetLastError() <<endl;
return 5; // 错误,返回
}
PurgeComm( hCreate,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); // 全部清空
Success = SetCommMask( hCreate,EV_TXEMPTY | EV_RXCHAR ); // 设置等待事件
if( !Success )
{
cerr<<"Initial中设置SetCommMask出错,错误原因是" <<GetLastError() <<endl;
return 1; // 错误,返回
}
return 0; //成功
}
int _COM::WriteCom( PACKAGE pck)
{
ULONG SentLen;
//PurgeComm( hCreate,PURGE_TXCLEAR ); // 清空发送缓冲区
Success = WriteFile( hCreate,&pck,sizeof(PACKAGE),&SentLen,&SendOV );
GetOverlappedResult(hCreate,&SendOV,&SentLen,TRUE); //等待发送完成
SendEvent.ResetEvent();
return 0;
}
PACKAGE* _COM::ReadCom( void )
{
ULONG ReadLen;
ReadFile(hCreate,(char *)&RecvPck,sizeof(PACKAGE),&ReadLen,&RecvOV); //读字符
GetOverlappedResult(hCreate,&RecvOV,&ReadLen,TRUE); //等待读状态完成
RecvEvent.ResetEvent();//复位事件变量
return &RecvPck;
}
int _COM::CloseCom()
{
Success = CloseHandle( hCreate );
if( !Success )
{
cerr<<"关闭串口出错,错误原因是" <<GetLastError() <<endl;
return 1; // 错误,返回
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -