|
|
// Serial.h: interface for the CSerial class.
|
|
|
//
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
/*---------------------------------------------------------------------------
|
|
|
概述:串口读写操作类,用于对串口进行读写操作,即收发数据。
|
|
|
|
|
|
使用环境:windows操作系统
|
|
|
VS2008 VS2010 VS2013
|
|
|
|
|
|
应用示例:
|
|
|
|
|
|
1. 定义对象
|
|
|
CSerial m_Serial;
|
|
|
|
|
|
2. 初始化
|
|
|
if (!m_Serial.Initialize("COM5",38400))
|
|
|
{
|
|
|
MessageBox("串口初始化失败","提示");
|
|
|
}
|
|
|
|
|
|
3. 设置串口接收数据回调函数
|
|
|
m_Serial.SetComReadCallback(GetSerialPortData);
|
|
|
|
|
|
函数定义示例如下:
|
|
|
void GetSerialPortData(char *buffer,const DWORD size)
|
|
|
{
|
|
|
// 完成数据接收后的处理工作
|
|
|
}
|
|
|
|
|
|
4. 通过串口发送数据
|
|
|
if (TRUE == m_Serial.IsInitialized())
|
|
|
{
|
|
|
unsigned char buffer[10];
|
|
|
m_Serial.WriteABuffer(buffer,10); // 举例
|
|
|
}
|
|
|
|
|
|
5. 卸载串口
|
|
|
if (TRUE == m_Serial.IsInitialized())
|
|
|
{
|
|
|
m_Serial.DeInit();
|
|
|
}
|
|
|
|
|
|
其它接口函数根据实际需求进行调用。
|
|
|
|
|
|
|
|
|
问题及解决情况记录:
|
|
|
问题1:
|
|
|
解决情况:
|
|
|
|
|
|
问题2:
|
|
|
解决情况:
|
|
|
|
|
|
......
|
|
|
|
|
|
修改记录:
|
|
|
版本 日期 作者 备注
|
|
|
V1.0 2016/11/29 王家星 在原有代码整理与简化,添加头文件注释
|
|
|
----------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
|
|
#if !defined(AFX_SERIAL_H_UAV)
|
|
|
#define AFX_SERIAL_H_UAV
|
|
|
|
|
|
#if _MSC_VER > 1000
|
|
|
#pragma once
|
|
|
#endif
|
|
|
|
|
|
#define MAX_OUT_BUFFER 2048
|
|
|
#define MAX_IN_BUFFER 2048
|
|
|
#define CHECK_TIMEOUT 110
|
|
|
|
|
|
// 回调函数定义
|
|
|
typedef void(*COMCALLBACK)(char *buffer,const DWORD size);
|
|
|
|
|
|
class CSerial
|
|
|
{
|
|
|
public:
|
|
|
CSerial();
|
|
|
virtual ~CSerial();
|
|
|
public:
|
|
|
/* 【1】
|
|
|
功能: 设置对串口读入数据进行处理的回调函数
|
|
|
输入:
|
|
|
func,串口回调函数地址
|
|
|
输出:
|
|
|
返回值:无
|
|
|
*/
|
|
|
void SetComReadCallback(COMCALLBACK func);
|
|
|
|
|
|
/* 【2】
|
|
|
功能: 初始化串口
|
|
|
输入:
|
|
|
1. serial_port,用字符串表示的串口名称:例如:“COM5”
|
|
|
2. baud_rate,波特率
|
|
|
3. byte_size,数据位长度
|
|
|
4. parity ,校验类型
|
|
|
5. stopbits,停止位长度
|
|
|
输出:
|
|
|
返回值: BOOL 型,表明是否初始化成功
|
|
|
*/
|
|
|
BOOL Initialize(char *serial_port,
|
|
|
DWORD baud_rate = CBR_9600,
|
|
|
BYTE byte_size = 8,
|
|
|
BYTE parity = NOPARITY,
|
|
|
BYTE stopbits = ONESTOPBIT);
|
|
|
|
|
|
/* 【3】
|
|
|
功能: 判断是否已经进行了初始化
|
|
|
输入:
|
|
|
输出:
|
|
|
返回值: BOOL 型,表明是否初始化成功
|
|
|
*/
|
|
|
BOOL IsInitialized()const;
|
|
|
|
|
|
|
|
|
/* 【4】
|
|
|
功能: 断开串口
|
|
|
输入:
|
|
|
输出:
|
|
|
返回值:
|
|
|
*/
|
|
|
void DeInit();
|
|
|
|
|
|
|
|
|
/* 【5】
|
|
|
功能:通过串口向外发送数据
|
|
|
输入:
|
|
|
1. buffer:待发送的数据
|
|
|
2. size:buffer的大小
|
|
|
输出:
|
|
|
返回值:
|
|
|
*/
|
|
|
void WriteABuffer(unsigned char*buffer,DWORD size);
|
|
|
|
|
|
|
|
|
/* 【6】
|
|
|
功能:读进串口数据
|
|
|
输入:
|
|
|
buffer,读进的数据
|
|
|
输出:
|
|
|
返回值: DWORD型,读进的数据的大小
|
|
|
*/
|
|
|
DWORD ReadABuffer(char*buffer);
|
|
|
|
|
|
|
|
|
/* 【7】
|
|
|
功能:获取读串口完成事件句柄
|
|
|
输入:
|
|
|
输出:
|
|
|
返回值:HANDLE* 型,读串口完成事件句柄
|
|
|
*/
|
|
|
HANDLE* GetReadCompletedEvent()const;
|
|
|
|
|
|
/* 【8】
|
|
|
功能: 得到写串口完成事件句柄
|
|
|
输入:
|
|
|
输出:
|
|
|
返回值:HANDLE* 型,写串口完成事件句柄
|
|
|
*/
|
|
|
HANDLE* GetWriteCompletedEvent()const;
|
|
|
|
|
|
/* 【9】
|
|
|
功能: 关闭写串口线程
|
|
|
输入:
|
|
|
输出:
|
|
|
返回值:
|
|
|
*/
|
|
|
void ExitWriteThread();
|
|
|
|
|
|
/* 【10】
|
|
|
功能: 重启写串口线程
|
|
|
输入:
|
|
|
输出:
|
|
|
返回值: BOOL 型,表明是否成功
|
|
|
*/
|
|
|
BOOL RestartWriteThread();
|
|
|
|
|
|
/* 【11】
|
|
|
功能: 重启读串口线程
|
|
|
输入:
|
|
|
输出:
|
|
|
返回值: BOOL型,表明是否成功
|
|
|
*/
|
|
|
BOOL RestartReadThread();
|
|
|
|
|
|
/* 【12】
|
|
|
功能: 退出读串口线程
|
|
|
输入:
|
|
|
输出:
|
|
|
返回值:
|
|
|
*/
|
|
|
void ExitReadThread();
|
|
|
|
|
|
/* 【13】
|
|
|
功能: 获取串口写线程ID
|
|
|
输入:
|
|
|
输出:
|
|
|
返回值:DWORD型,写线程ID
|
|
|
*/
|
|
|
DWORD GetWriteThreadID()const;
|
|
|
|
|
|
/* 【14】
|
|
|
功能: 获取串口读线程ID
|
|
|
输入:
|
|
|
输出:
|
|
|
返回值:DWORD型,读线程ID
|
|
|
*/
|
|
|
DWORD GetReadThreadID()const;
|
|
|
|
|
|
|
|
|
/* 【15】
|
|
|
功能: 读串口线程函数
|
|
|
输入:
|
|
|
LPVOID para,传入读串口线程的参数,为PDATA_PACKAGE型
|
|
|
输出:
|
|
|
返回值:DWORD 型,表明线程返回
|
|
|
*/
|
|
|
friend DWORD WINAPI ReadThreadFunc(LPVOID para);
|
|
|
|
|
|
|
|
|
/* 【16】
|
|
|
功能: 写串口线程函数
|
|
|
输入:
|
|
|
LPVOID para,传入写串口线程的参数,为PDATA_PACKAGE型
|
|
|
输出:
|
|
|
返回值: DWORD 型,表明线程返回
|
|
|
*/
|
|
|
friend DWORD WINAPI WriteThreadFunc(LPVOID para);
|
|
|
|
|
|
protected:
|
|
|
void HandleSuccessRead();
|
|
|
HANDLE m_hComHandle; /*串口句柄*/
|
|
|
HANDLE m_hWriteThread; /*写串口线程句柄*/
|
|
|
DWORD m_dwWriteProcID; /*写串口线程ID*/
|
|
|
HANDLE m_hReadThread; /*读串口线程句柄*/
|
|
|
DWORD m_dwReadProcID; /*读串口线程ID*/
|
|
|
HANDLE m_hWriteCompletedEvent; /*写串口完成事件*/
|
|
|
HANDLE m_hReadCompletedEvent; /*读串口完成事件*/
|
|
|
BOOL m_bIsInitialized; /*是否初始化的标志*/
|
|
|
HANDLE m_hExitReadThreadEvent; /*结束读串口线程的事件句柄*/
|
|
|
HANDLE m_hExitWriteThreadEvent; /*结束写串口线程的事件句柄*/
|
|
|
HANDLE m_hStartWriteEvent; /*开始写串口时间句柄*/
|
|
|
DWORD m_dwWritten; /*实际向外发送的数据量*/
|
|
|
DWORD m_dwToWrite; /*需要向外发送的数据量*/
|
|
|
DWORD m_dwRead; /*实际读进的数据*/
|
|
|
CRITICAL_SECTION m_csReadSection; /*处理读入数据的关键代码段*/
|
|
|
CRITICAL_SECTION m_csWriteSection; /*处理发送数据的关键代码段*/
|
|
|
|
|
|
char out_buffer[MAX_OUT_BUFFER];
|
|
|
char in_buffer[MAX_IN_BUFFER];
|
|
|
COMCALLBACK ReadCallBack; /*处理输入的回调函数*/
|
|
|
};
|
|
|
|
|
|
#endif // !defined(AFX_SERIAL_H_UAV)
|