参照网上写了个串口操作类:为了方便调用将串口类进行了封装,增加了命令发送类,CSend;以后我只要通过对CSend的方法进行操作即可,CSend里面有个命令发送方法:SendCommond;该方法通过解析读进程的数据而判断是否成功。
我现在希望同时打开多个串口,每个串口读写进程相互独立,那目前声明全局变量bufDataReceived的方式就不行了,而改成私有变量的话不知道如何调用回传函数OnDataArrive() 请高手指点。
源代码这里http://www.andabc.com/Temp/SerialPortTest.rar下载,希望大家不吝指教。
VC2005 MFC DLL

解决方案 »

  1.   


    贴出源代码:
    Send.h#pragma onceclass CSend
    {
    public:
    CSend(void);
    public:
    ~CSend(void);public:
    BOOL OpenPort(int nPort);
    BOOL ClosePort();
    bool IsOpen();
    BOOL SendCommond(BYTE *lpBufferOut,int &Len);};
    Send.cpp
    #include "StdAfx.h"
    #include "iostream" 
    #include <iomanip>
    #include "PSerialPort.h"
    #include "Send.h"CSend::CSend(void)
    {
    }CSend::~CSend(void)
    {
    }
    //-----------全局变量
    CPSerialPort *m_pSerial;
    char bufDataReceived[255];
    int intDataReceived;
    BOOL Open;
    BOOL Receive;
    //-----------全局变量void OnDataArrive(char *data,int length,DWORD userdata)
    {  
    //处理收到的数据
    int i;
    if(length!=0)
    {
    for(i=0;i<length;i++)
    {
    bufDataReceived[intDataReceived] = data[i]; intDataReceived++;
    }
    }
    }bool CSend::IsOpen()
    {  
    if(Open)
    {return true;}
    else
    {return false;}}BOOL CSend::OpenPort(int nPort)

    CString sPort;
    sPort.Format(_T("\\\\.\\COM%d"), nPort);
    //串口类变量
    m_pSerial=new CPSerialPort();
    Open = m_pSerial->OpenPort(sPort,57600,8,2,2,OnDataArrive,(DWORD)this); return   Open;}//
    BOOL CSend::SendCommond(BYTE *lpBufferOut,int &Len)
    {  
    if(!Open)
    {//串口未打开
    return FALSE;
    } char byteSecondCommand; DWORD dwRealSend = 0;
    char pSendBuf[5];
    pSendBuf[0]=0x00;
    pSendBuf[1]=0x00;
    pSendBuf[2]=0x00;
    pSendBuf[3]=0x00;
    pSendBuf[4]=0x00;    BOOL boolReadReault; //定义读取结果
    DWORD dwBytesWritten=0;
    intDataReceived =0;//初始化计数器//m_pSerial->Activate();//激活接受线程
    dwBytesWritten=m_pSerial->WritePort(pSendBuf,5);//发送数据
    if(dwBytesWritten==0)
    {
    AfxMessageBox(_T("无法向端口写入数据!"));
    }
    while(1)
    {
    Sleep(1); //暂停1毫秒
    //未读到卡
    if((BYTE)bufDataReceived[0]==0x01)
    {  
    boolReadReault=TRUE;
    lpBufferOut[0]= 0x01;
    Len = 1;
    break;
    }
    else if((BYTE)bufDataReceived[0]==0x00)
    {
    boolReadReault=FALSE;
    lpBufferOut[0]= 0x00;
    Len = 1;
    break; }
    }
    return boolReadReault;
    }
      

  2.   

    OpenPort(sPort,57600,8,2,2,OnDataArrive,(DWORD)this);
    既然是串口类,那么串口里的波特率等的设置不应该写死的吧,应该有设置这些的函数
      

  3.   

    这个类就是测试,因为我串口的参数就是57600,8,2,2的这个可以修改的;
    当前是OnDataArrive 这个类要么声明全局的 要么声明static的 ,要是这样的话接收变量:
    //-----------全局变量
    CPSerialPort *m_pSerial;
    char bufDataReceived[255];
    int intDataReceived;
    BOOL Open;
    BOOL Receive;
    //-----------全局变量怎么个声明法?
    因为上面的变量定义方法为全局变量,要是实现每个串口类独立的对象就是这块:  //串口类变量
    m_pSerial=new CPSerialPort();就是在打开每个串口是 声明一个串口类对象,那么 m_pSerial类是不是只能是私有的?
    这样如何实现??
      

  4.   

    顶。我做串口通信的时候都用Win32 API直接操作