求串口通信编程实践(龚建伟)源代码

duoxiangliuti 2010-10-12 08:49:27
csdn资源里有很多,但是不知道怎么都下不了,还扣了我几十分,郁闷!我现在急用,希望有这个资料的朋友能给我发一份,非常感谢!
邮箱:08wenlong@163.com
给一个免费的可以下载的网址也行!
...全文
933 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangxp2006 2012-01-08
  • 打赏
  • 举报
回复
发给我一份啊
ruwei2009 2011-07-09
  • 打赏
  • 举报
回复
正在学习这方面的东西
youfeng888 2010-10-13
  • 打赏
  • 举报
回复
串口通信我这有个写好的类,可以用下,希望能带给你学习和帮助,基本都是常规的操作啊!
异步,等待串口事件;等待异步对象,分析返回值,分析事件,再处理!

class CCom
{
public:
//------------------------------Construction-----------------------------------
//第1个参数为是否在打开串口时启动监视线程, 第2个参数为IO方式 阻塞方式(0)/ 异步重叠方式(默认)
CCom(BOOL bAutoBeginThread = TRUE, DWORD dwIOMode = FILE_FLAG_OVERLAPPED);
virtual ~CCom();

//----------------------------------Operations----------------------------------
//CnComm配置字符串的标准写法:
//"BBBB,P,D,S" BBBB 为波特率,P 为奇偶校验,D 为数据位数,S 为停止位数。
//打开串口 缺省 9600, n, 8, 1
BOOL Open(DWORD dwPort);
//打开串口 缺省 baud_rate, n, 8, 1
BOOL Open(DWORD dwPort, DWORD dwBautRate);
//打开串口, 使用类似"9600, n, 8, 1"的设置字符串设置串口
BOOL Open(DWORD dwPort, char* szSetStr);

//读取串口 dwBufferLength个字符到 Buffer 返回实际读到的字符数 可读任意数据
DWORD Read(LPVOID Buffer, DWORD dwBufLength, DWORD dwWaitTime = 10);
//读取串口 dwBufferLength - 1 个字符到 szBuffer 返回ANSI C 模式字符串指针 适合一般字符通讯
char* ReadString(char* szBuffer, DWORD dwBufferLength, DWORD dwWaitTime = 20);
//读串口 同步应用
DWORD ReadSync(LPVOID Buffer, DWORD dwBufferLength);
//写串口 可写任意数据 "abcd" or "\x0\x1\x2"
DWORD Write(LPVOID Buffer, DWORD dwBufferLength);
//写串口 写ANSI C 模式字符串指针
DWORD Write(const char* szBuffer);
//写串口 同步应用
DWORD WriteSync(LPVOID Buffer, DWORD dwBufferLength);
//写串口 szBuffer 可以输出格式字符串 包含缓冲区长度
DWORD Write(char* szBuffer, DWORD dwBufferLength, char* szFormat, ...);
//写串口 szBuffer 可以输出格式字符串 不检查缓冲区长度 小心溢出
DWORD Write(char* szBuffer, char* szFormat);
//关闭串口 同时也关闭关联线程
virtual void Close();

struct InnerLock
{
CCom* ptr;
InnerLock(CCom* p) : ptr(p)
{
ptr->Lock();
}
~InnerLock()
{
ptr->UnLock();
}
};
//锁定资源
void Lock()
{
::EnterCriticalSection(&m_mutex);
}
void UnLock()
{
::LeaveCriticalSection(&m_mutex);
}
//DTR 电平控制
BOOL SetDtr(BOOL OnOrOff)
{
return IsOpen()? EscapeCommFunction(m_hComHandle, OnOrOff? SETDTR : CLRDTR) !=0 : FALSE;
}
//RTS 电平控制
BOOL SetRts(BOOL OnOrOff)
{
return IsOpen()? EscapeCommFunction(m_hComHandle, OnOrOff? SETRTS : CLRRTS) != 0 : FALSE;
}

BOOL SetBreak(BOOL OnOrOff)
{
return IsOpen()? EscapeCommFunction(m_hComHandle, OnOrOff? SETBREAK : CLRBREAK) != 0 : FALSE;
}
//辅助线程控制 建监视线程
BOOL BeginThread();
//暂停监视线程
inline BOOL SuspendThread()
{
return IsThreadRunning()? ::SuspendThread(m_hThreadHandle) != 0xFFFFFFFF : FALSE;
}
//恢复监视线程
inline BOOL ResumeThread()
{
return IsThreadRunning()? ::ResumeThread(m_hThreadHandle) != 0xFFFFFFFF : FALSE;
}
//终止线程
BOOL EndThread(DWORD dwWaitTime = 100);

//----------------------------------Attributes----------------------------------
//判断串口是或打开
inline BOOL IsOpen() {return m_hComHandle != INVALID_HANDLE_VALUE;}
//获得串口句炳
HANDLE GetHandle() {return m_hComHandle;}
//获得串口序号
const int GetPortID() {return m_dwPort;}
//获得串口全名
const char* GetPortName() {return m_szComStr;}
//获得串口参数 DCB
DCB* GetState()
{
return IsOpen() && ::GetCommState(m_hComHandle, &m_DCB) == TRUE ? &m_DCB : NULL;
}
//设置串口参数 DCB
BOOL SetState(DCB* pDCB = NULL)
{
return IsOpen() ? SetCommState(m_hComHandle, pDCB == NULL? &m_DCB : pDCB) == TRUE : FALSE;
}
//设置串口参数:波特率,停止位,等 支持设置字符串 "9600, 8, n, 1"
BOOL SetState(char* szSetStr);
//设置串口参数:波特率,停止位,等
BOOL SetState(DWORD dwBautRate, DWORD dwByteSize = 8, DWORD dwParity = NOPARITY, DWORD dwStopBits = ONESTOPBIT);
//获得超时结构
LPCOMMTIMEOUTS GetTimeouts()
{
return IsOpen()&&::GetCommTimeouts(m_hComHandle, &m_ComTimeOuts) == TRUE ? &m_ComTimeOuts : NULL;
}
//设置超时
BOOL SetTimeouts(LPCOMMTIMEOUTS lpCO)
{
return IsOpen()? ::SetCommTimeouts(m_hComHandle, lpCO) == TRUE : FALSE;
}
//设置串口的I/O缓冲区大小
BOOL SetBufferSize(DWORD dwInputSize, DWORD dwOutputSize)
{
return IsOpen()? ::SetupComm(m_hComHandle, dwInputSize, dwOutputSize) == TRUE : FALSE;
}
//清除接受缓冲区
void ClearInputBuffer()
{
if(IsOpen())
PurgeComm(m_hComHandle, PURGE_RXABORT|PURGE_RXCLEAR);
}
//清除发送缓冲区
void ClearOutputBuffer()
{
if (IsOpen())
PurgeComm(m_hComHandle, PURGE_TXABORT|PURGE_TXCLEAR);
}
//关联消息的窗口句柄
inline void SetWnd(HWND hWnd)
{
assert(::IsWindow(hWnd));
m_hNotifyWnd = hWnd;
}
//设定发送通知, 接受字符最小值
inline void SetNotifyNum(DWORD dwNum)
{
m_dwNotifyNum = dwNum;
}
//线程是否运行
inline BOOL IsThreadRunning() {return m_hThreadHandle != NULL;}
//获得线程句柄
inline HANDLE GetThread()
{
return m_hThreadHandle;
}
//设置要监视的事件, 打开前设置有效
void SetMaskEvent(DWORD dwEvent = DEFALUT_COM_MASK_EVENT)
{
m_dwMaskEvent = dwEvent;
}
//获得读缓冲区的字符数
int GetInputSize()
{
COMSTAT Stat;
DWORD dwError;
return ::ClearCommError(m_hComHandle, &dwError, &Stat) == TRUE? Stat.cbInQue : (DWORD)-1L;
}

//Attributes
protected:
volatile DWORD m_dwPort; //串口号
volatile HANDLE m_hComHandle; //串口句柄
char m_szComStr[20]; //保存Com1类似的字符串

DCB m_DCB; //定义波特率,停止位,等
COMMTIMEOUTS m_ComTimeOuts; //超时结构

DWORD m_dwIOMode; //0,同步 默认 FILE_FLAG_OVERLAPPED 重叠I/O 异步
OVERLAPPED m_overlappedRead, m_overlappedWrite;

volatile HANDLE m_hThreadHandle; //辅助线程
volatile HWND m_hNotifyWnd; //通知窗口
volatile DWORD m_dwNotifyNum; //接受多少字节(>=m_dwNotifyNum)发送通知消息
volatile DWORD m_dwMaskEvent; //监视的事件
volatile BOOL m_bRunFlag; //线程运行循环标志
BOOL m_bAutoBeginThread; //open() 自动BeginThread();
OVERLAPPED m_overlappedWait;

protected:
//初始化
virtual void Init();
//析构
virtual void Destroy();
//绑定串口
void BindCommPort(DWORD dwPort);
//打开串口
virtual BOOL OpenCommPort();
//设置串口
virtual BOOL SetUpPort();
//---------------------------------------threads callback-----------------------------------------------------
//线程收到消息自动调用, 如窗口句柄有效, 送出消息, 包含串口编号, 均为虚函数可以在基层类中扩展
virtual DWORD ThreadFunc();
virtual void OnReceive();
virtual void OnCts();
virtual void OnDsr();
virtual void OnRing();
virtual void OnRlsd();
virtual void OnBreak();
virtual void OnTxEmpty();
virtual void OnError();

private:
CCom(const CCom&);
CCom& operator = (const CCom&);
CRITICAL_SECTION m_mutex;

#ifdef _MT
static UINT APIENTRY CommThreadProc(LPVOID lpPara)
#else
static DWORD WINAPI CommThreadProc(LPVOID lpPara)
#endif
{
return ((CCom*)lpPara)->ThreadFunc();
}
};

欢迎来我空间看看,希望能找到需要的
haidao1128 2010-10-13
  • 打赏
  • 举报
回复
发给你了,自己查收邮箱
haidao1128 2010-10-13
  • 打赏
  • 举报
回复
我有这本书的电子版,要的话,我发给你,我也正在学习串口方面的知识
haidao1128 2010-10-13
  • 打赏
  • 举报
回复
我有这本书的电子版,要的话,我发给你,我也正在学习串口方面的知识
duoxiangliuti 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ddlddy 的回复:]
去他的主页不就可以了么?
http://www.gjwtech.com/
[/Quote]
个人主页里是没有的!
duoxiangliuti 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kongfanmings 的回复:]
http://download.csdn.net/source/2337120 我的资源不要分
[/Quote]
我要的是这本书附带光盘的内容!你的好像只是串口调试助手的源代码!
kongfanmings 2010-10-12
  • 打赏
  • 举报
回复
http://download.csdn.net/source/2337120 我的资源不要分
龙哥依旧 2010-10-12
  • 打赏
  • 举报
回复
去他的主页不就可以了么?
http://www.gjwtech.com/
wangsheng8888 2010-10-12
  • 打赏
  • 举报
回复
这个程序里有很多bug,接收时有问题

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧