posts - 6,  comments - 6,  trackbacks - 0
  2008年10月22日

Comm.h头文件:

 

 

#ifndef __CCOMM_H__
#define __CCOMM_H__

class CComm  //串口操作封装类
{
private:
    HANDLE m_hComm;
public:
    CComm();  
//构造函数
    ~CComm();  //析构函数

    BOOL OpenComm(
int nComm);  //打开串口函数
    void CloseComm();  //关闭串口函数

    BOOL SetComm(
int nBaudRate/*波特率*/,int nParity/*奇偶校验位*/,int nByteSize/*字节位数*/,int nStopBits/*停止位*/);  //设置串口函数
    BOOL SetTimeOuts();  //设置超时函数

    BOOL ReadComm(
char * lpBuf,int nLen);  //读串口函数
    BOOL WriteComm(char * lpBuf,int nLen);  //写串口函数
};

#endif

 

Comm.cpp实现文件:

 

#include "StdAfx.h"
#include 
"Comm.h"

//构造函数
CComm::CComm()
{
}

//析构函数
CComm::~CComm()
{
    CloseComm();  
//关闭串口
}

//打开串口函数
BOOL CComm::OpenComm(int nComm)
{
    CString strCommName;
    CString strErrInfo;

    strCommName.Format(
"COM%d",nComm);

    m_hComm 
= ::CreateFile(strCommName,  /*要打开串口名称*/
                        GENERIC_READ 
| GENERIC_WRITE,  /*允许读和写*/
                        
0,  /*独占方式*/
                        NULL,  
/*安全属性*/
                        OPEN_EXISTING,  
/*打开而不是创建*/
                        
0/*同步方式*/
                        NULL);  
/*模板句柄*/

    
if(m_hComm == INVALID_HANDLE_VALUE)
    {
        strErrInfo.Format(
"打开%s失败!",strCommName);
        AfxMessageBox(strErrInfo);
        
return FALSE;
    }
    
else
    {
        
return TRUE;
    }
}

//关闭串口函数
void CComm::CloseComm()
{
    
if(m_hComm != INVALID_HANDLE_VALUE)
    {
        ::CloseHandle(m_hComm);
        m_hComm 
= INVALID_HANDLE_VALUE;
    }
}

//设置串口函数
BOOL CComm::SetComm(int nBaudRate/*波特率*/,int nParity/*奇偶校验位*/,int nByteSize/*字节位数*/,int nStopBits/*停止位*/)
{
    DCB stDCB;
    memset(
&stDCB,0,sizeof(stDCB));
    
if(!::GetCommState(m_hComm,&stDCB))  //获取串口当前状态属性
        return FALSE;
    stDCB.BaudRate 
= nBaudRate;  //波特率
    stDCB.fParity = 0;
    stDCB.Parity 
= nParity;  //奇偶校验位(NOPARITY等)
    stDCB.ByteSize = nByteSize;  //每个字节有8位
    stDCB.StopBits = nStopBits;  //停止位(ONESTOPBIT等)
    if(!::SetCommState(m_hComm,&stDCB))  //设置串口状态属性
        return FALSE;

    
if(!::SetupComm(m_hComm,1024,1024))  //设置输入缓冲区和输出缓冲区的大小
        return FALSE;
    ::PurgeComm(m_hComm,PURGE_TXCLEAR 
| PURGE_RXCLEAR);  //清空输入输出缓冲区

    
return TRUE;
}

//设置超时函数
BOOL CComm::SetTimeOuts()
{
    COMMTIMEOUTS stTimeOuts;

    stTimeOuts.ReadIntervalTimeout 
= 0;  //设定读超时
    stTimeOuts.ReadTotalTimeoutMultiplier = 100;
    stTimeOuts.ReadTotalTimeoutConstant 
= 500;

    stTimeOuts.WriteTotalTimeoutMultiplier 
= 100;  //设定写超时
    stTimeOuts.WriteTotalTimeoutConstant = 500;

    ::SetCommTimeouts(m_hComm,
&stTimeOuts);  //设置超时
    ::PurgeComm(m_hComm,PURGE_TXCLEAR | PURGE_RXCLEAR);  //清空输入输出缓冲区
    return TRUE;
}

//读串口函数
BOOL CComm::ReadComm(char * lpBuf,int nLen)
{
    
if(::ReadFile(m_hComm,lpBuf,nLen,(DWORD *)&nLen,NULL) == FALSE)
    {
        
return FALSE;
    }
    
else
    {
        
/*
        CString str;
        str.Format("%d",nLen);
        AfxMessageBox(str);
        
*/
        
        
//::PurgeComm(m_hComm,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
        return TRUE;
    }
}

//写串口函数
BOOL CComm::WriteComm(char * lpBuf,int nLen)
{
    
if(::WriteFile(m_hComm,lpBuf,nLen,(DWORD *)&nLen,NULL) == FALSE)
    {
        
return FALSE;
    }
    
else
    {
        
/*
        CString str;
        str.Format("%d",nLen);
        AfxMessageBox(str);
        
*/
        
return TRUE;
    }
}
posted @ 2008-10-22 20:25 ZYM 阅读(24) | 评论 (0)编辑
  2008年4月18日
     摘要: 编译第一个驱动程序笔记  阅读全文
posted @ 2008-04-18 10:47 ZYM 阅读(295) | 评论 (1)编辑
  2008年4月14日
     摘要:   阅读全文
posted @ 2008-04-14 16:07 ZYM 阅读(275) | 评论 (1)编辑
     摘要: CMemScanner.h(内存扫描器类):#ifndefCMEMSCANNER_H#defineCMEMSCANNER_H#include<stdio.h>#include"AddrList.h"#include"PageList.h"classCMemScanner//内存扫描器类{private:HANDLEm_hProcess;//待扫描进程句柄public:CAddrList... 阅读全文
posted @ 2008-04-14 14:26 ZYM 阅读(519) | 评论 (1)编辑
     摘要: 上一次写过一篇VB制作QQ自动登录器的日志,介绍用得是模拟键盘输入的方式实现QQ的自动登录。这种方式有一种缺陷,就是必须保持输入焦点的正确,否则很容易就打乱了程序的执行过程,造成无法登录。特别是一开机就运行该程序,然后该程序去调用QQ的时候,Win API Winexec执行特慢,导致程序跟不上QQ,输入焦点也错了。后来在网上又发现了一种用QQ命令行的方式来实现自动登录的,这种方式明显更好用。该命... 阅读全文
posted @ 2008-04-14 08:36 ZYM 阅读(354) | 评论 (2)编辑
     摘要: '在VB中建一工程,工程名为QQAutoLogin。移除系统自动添加的窗体Form1。在该工程下添加一模块,模块名为QQAutoLoginMod。复制以下代码到模块中。OptionExplicit'-----------------------API定义-------------------------------DeclareSubSleepLib"kernel32"(ByValdwMillis... 阅读全文
posted @ 2008-04-14 08:24 ZYM 阅读(404) | 评论 (1)编辑