我要用VB写多机通信的上位机通信程序,但是VB中只有一个MSCOMM不能实现谁有办法帮个忙。
但是想了一下可以用C写一个发送程序做成的DLL的文件,可是做不出来,大家帮个忙吧!

解决方案 »

  1.   

    HANDLE hidcomdrv;
    bool opened=false ;
    extern"C"_declspec(dllexport)bool open(int nport,LPSTR Settings)
    { if (opened) return(true);
    char spname[8];
    DWORD dwerror;
    DCB dcb;
    wsprintf(spname,"COM%d",nport);
    hidcomdrv=::CreateFile(spname,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
    if (hidcomdrv==INVALID_HANDLE_VALUE)
    {
    dwerror=::GetLastError();
    AfxMessageBox("Can not Open Comm");
    return(false);
    }
    if(::GetCommState(hidcomdrv,&dcb))
    {
    dcb.BaudRate=9600;
    dcb.ByteSize =8;
    dcb.fParity =0;
    dcb.StopBits =0;
    dcb.Parity =0;
    // ::Beep(500,100);
            if(!::SetCommState(hidcomdrv,&dcb))
    {
    AfxMessageBox("Can not Open Comm");
    return(false);
    }
    else
    {
    opened=true;
    AfxMessageBox(" Com is Opened");
    return(opened);
    }

    }
    else
    {
    opened=false;
    AfxMessageBox(" Com is not Opened");
    return(opened);
    }
        
    }
    extern"C"_declspec(dllexport)bool close()
    {
    if(!opened||hidcomdrv==NULL)return(true);
    ::PurgeComm(hidcomdrv,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
    ::EscapeCommFunction(hidcomdrv,CLRDTR);
    ::CloseHandle (hidcomdrv);
        AfxMessageBox("Comm is Colsed");
    opened=false;
    hidcomdrv=NULL;
    return(true);
    }
    extern"C"_declspec(dllexport)int  readStr(LPSTR buffer)
    {
    int rlen;
    if (!opened||hidcomdrv==NULL)return(0);
    DWORD dwbytesread,dwerrorflags;
    COMSTAT comstat;
    static OVERLAPPED ovread;
    ::ClearCommError (hidcomdrv,&dwerrorflags,&comstat);
    dwbytesread=(DWORD)comstat.cbInQue ;
    rlen=(int)dwbytesread;
        ::Beep(500,100);
    if (rlen>300) 
    {
    dwbytesread=(DWORD)300;
    }
    if(!::ReadFile(hidcomdrv,buffer,dwbytesread,&dwbytesread,&ovread))
    {
    ::GetLastError ();
    ::Beep(5000,1000);
    return(0);
    }
    else
    {
    rlen=(int)dwbytesread;
            ::Beep(500,100);
    return(rlen);
    }
    }
    extern"C"_declspec(dllexport)int  writeStr(LPSTR buffer,int wlen)
    {
    // char spname[8];
        if (!opened||hidcomdrv==NULL)return(0);
    DWORD dwbyteswritten=0;
    static OVERLAPPED ovwrite;
    dwbyteswritten=(DWORD)wlen;
    if(!::WriteFile (hidcomdrv,buffer,dwbyteswritten,&dwbyteswritten,&ovwrite))
    {
    ::GetLastError();
            ::Beep(5000,1000);
    return(0);        
    }
    else
        {
    // wsprintf(spname,"Ret%d",(int)dwbyteswritten);
    //        AfxMessageBox("     ");
    ::Beep(500,100);
            return((int)dwbyteswritten);
    }
    }
    extern"C"_declspec(dllexport)bool settime(int time)
    {
    LPCOMMPROP cp;
    COMMTIMEOUTS to;
    cp=(LPCOMMPROP)malloc(1000);
    if(!::GetCommProperties(hidcomdrv,cp))
    {
         return(false);
    }
    if (!(cp->dwProvCapabilities &PCF_TOTALTIMEOUTS))
    {
         AfxMessageBox("Comm  OUTTIME SET IS CLOSED");
             return(false);
    }
    to.ReadIntervalTimeout =0;
    to.ReadTotalTimeoutMultiplier =0;
    to.ReadTotalTimeoutConstant =time;
    to.WriteTotalTimeoutMultiplier =0;
    to.WriteTotalTimeoutConstant =time;
    // ::Beep(500,100);
    if(!::SetCommTimeouts (hidcomdrv,&to))
    {
    return(false);
    }
    return (true);
    }
      

  2.   

    gys_yxr(毛毛) 给他个DLL和调用说明不就行了,偶没搞过,但偶是学机械的,将来肯定要接触这方面的东西,学习。
      

  3.   

    用API函数打开串口进行通讯,这样灵活得多