You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

256 lines
4.9 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 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. sizebuffer的大小
输出:
返回值:
*/
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)