19,519
社区成员




// CESeries.h: interface for the CCESeries class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_CESERIES_H__1952D4CB_F6A6_489B_80B2_FD59F845BC86__INCLUDED_)
#define AFX_CESERIES_H__1952D4CB_F6A6_489B_80B2_FD59F845BC86__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//定义串口接收数据函数类型
typedef void (CALLBACK* ONSERIESREAD)(CWnd*,BYTE* buf,int bufLen);
//CE串口通讯类
class CCESeries
{
public:
CCESeries();
virtual ~CCESeries();
//打开串口
BOOL OpenPort(CWnd* pPortOwner, //使用串口类,窗体句柄
UINT portNo = 1, //串口号
UINT baud = 19200, //波特率
UINT parity = NOPARITY, //奇偶校验
UINT databits = 8, //数据位
UINT stopbits = 1 //停止位
);
//关闭串口
void ClosePort();
//设置串口读取、写入超时
BOOL SetSeriesTimeouts(COMMTIMEOUTS CommTimeOuts);
//向串口写入数据
BOOL WritePort(const BYTE *buf,DWORD bufLen);
//串口读取回调函数
ONSERIESREAD m_OnSeriesRead;
private:
//串口读线程函数
static DWORD WINAPI ReadThreadFunc(LPVOID lparam);
//串口写线程函数
static DWORD WINAPI WriteThreadFunc(LPVOID lparam);
//向串口写入数据
static BOOL WritePort(HANDLE hComm,const BYTE *buf,DWORD bufLen);
//关闭读线程
void CloseReadThread();
//关闭写线程
void CloseWriteThread();
//已打开的串口句柄
HANDLE m_hComm;
CWnd* m_pPortOwner;
//读写线程句柄
HANDLE m_hReadThread;
HANDLE m_hWriteThread;
//读写线程ID标识
DWORD m_dwReadThreadID;
DWORD m_dwWriteThreadID;
//读线程退出事件
HANDLE m_hReadCloseEvent;
//写线程退出事件
HANDLE m_hWriteCloseEvent;
};
#endif // !defined(AFX_CESERIES_H__1952D4CB_F6A6_489B_80B2_FD59F845BC86__INCLUDED_)
m_ceSeries.ClosePort();
m_ceSeries.OpenPort(this,1,19200,NOPARITY,8,1);
CString s;
s="0175";
bufLen = s.GetLength()*2;
ZeroMemory(buf,bufLen);
buf=(BYTE*)s.GetBuffer(s.GetLength());
s.ReleaseBuffer();
bool ii=m_ceSeries.WritePort(buf,bufLen);
if (!ii)
{
AfxMessageBox(L"写入失败");
}
if (msg.message == CM_THREADCOMMWRITE)
{
//向串口写
buf = (BYTE*)msg.lParam;
dwWriteLen = msg.wParam;