我用VB写了一个COM口钱箱打开的程序,但会出现有时打不开.且在程序加上了错误判断的,没有任何错误提示.
用API写那该如何去调用.打开COM口和发送数据.

解决方案 »

  1.   

    使用CreateFile,WriteFile,ReadFile等API来实现
      

  2.   

    在VB中用API实现串口操作有点不值得,在VB中用MsCOM控件吧,如果在VC中用API到时一个好办法,接收可以放在线程里实现,VB却不太容易实现。
      

  3.   

    vb 用mscom即可 如果打开钱箱经常失败  一般可以肯定的是说 你的程序有问题提示点:
    1.有没有考虑到单片机数据处理能力?你发送数据不可能太快
    2.通讯线是不是不稳定?
      

  4.   

    mscom控件和API各有得失;
    mscom在发送数据和接收数据实在是难以控制自如;但mscom在初始化串口的波特率却是很好的;
    API 有些厂商或个人写的DLL 也不是十全十美的;到目前我不般不用个人写的DLL 可靠性不大;
    个别厂商写的DLL 也不是技术很成熟;我建议楼主用台湾磨沙的DLL (pccomm.dll) 与串口通讯;台湾人的东西就是好,呵呵;
      

  5.   

    和串口打交道,算是我的一点长处了(呵呵,给自已吹牛一下)
    做过考勤机,食堂售饭机的后台软件和下位机的单片机程序,
    做过超市POS系统;有空去我公司的网站上看看:
    www.xherp.com
      

  6.   


    我觉得vb用mscom控件应该可以做得很好的,你说有时打不开,原因可能有:
    1. 波特率太高(钱箱的可以设置吗)
    2. 线路质量差(劣质线?线路太长?有没有线路转换,比如转RS485,光隔离吗?)
    3. 钱箱响应时间(处理能力可能超出预料)
    4. 通讯是不是应答式的(这可是mscom控件的弱项)
    ...
    (单位里买了一个USB转串口的东东,双机测试百分百成功,可是拿到变频器试就是不行?)
      

  7.   

    我写了一个com通讯的类,不过没有测试,代码如下:
      Option Explicit
      
      '串口打开标志
      Public m_bComFlag As Boolean
      '重叠读写
      Private m_osRead As OVERLAPPED
      Private m_osWrite As OVERLAPPED
      '线程函数中的等待事件句柄
      Public m_hPostMsgEvent As Long
      '串口的句柄
      Public m_hCom  As Long
      '串口名称
      Public DevName As String
      '超时设置
      Private timeouts   As COMMTIMEOUTS
      '数据控制块
      Private m_DCB As DCB
        
      '串口参数
      Public m_nByteRate As Integer
      Public m_nDataBit As Integer
      Public m_nStopBit As Integer
      Public m_nParity As Integer
      '*******************************
      Private PendingOutput$
      Private CurrentEventMask&
        '当前的通信事件掩码值Public Function OpenComm(Optional cbInQueue, Optional cbOutQueue) As Long
        '如串口已打开,则先关闭它
        Dim dDcb As DCB
        If m_hCom <> 0 Then CloseComm
        
        '异步重叠方式打开串口
        m_hCom = CreateFile(DevName, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0)
        
        If m_hCom = INVALID_HANDLE_VALUE Then
            Err.Raise vbObjectError + Err_NOCOMMACCESS, CLASS_NAME, "Unable to open communications device"
        End If
        
        '设置串口的输入和输出缓冲区
        If Not (IsMissing(cbInQueue) Or IsMissing(cbOutQueue)) Then
            Call SetupComm(m_hCom, cbInQueue, cbOutQueue)
        Else
            Call SetupComm(m_hCom, 8192, 1024)
        End If
        
        '设置超时时间
        GetCommTimeouts m_hCom, timeouts
        '把间隔超时设置最大,设置为零,将导致readfile立即返回并完成操作
        timeouts.ReadIntervalTimeout = &HFFFFFFFF
        timeouts.ReadTotalTimeoutMultiplier = 0
        timeouts.ReadTotalTimeoutConstant = 10
        '设置写超时已指定WriteComm成员函数中的GetOverLappedResult函数的等待时间
        timeouts.WriteTotalTimeoutMultiplier = 50
        timeouts.WriteTotalTimeoutConstant = 2000
        SetCommTimeouts m_hCom, timeouts
        
        ' Initialize the DCB to the current device parameters
        Call GetCommState(m_hCom, dDcb)
        
        dDcb.BaudRate = m_nBaudrate
        dDcb.ByteSize = m_nDataBit
        dDcb.StopBits = m_nStopBit
        dDcb.Parity = m_nParity
        
        dDcb.EvtChar = False
        
        Call SetCommState(m_hCom, dDcb)
        '设置串口的通信格式
        Currenteventmast = EV_RXCHAR
        Call SetCOmmmask(m_hCom, CurrentEventMask)
        '设置串口的通信事件掩码
        StartInput
    End Function
    Public Function CloseComm() As Long
        If m_bComFlag = False Then
            End Function
        End If
        m_bComFlag = True
        '结束线程函数中的WaitSingleObject函数的等待
        Call SetEvent(m_hPostMsgEvent)
        Call SetCOmmmask(m_hCom, 0)
        
        '等待辅助线程退出,或者是定时器完成退出
        '......
        If m_hCom <> 0 Then
            Call CloseHandle(Handle)
        End If
        m_hCom = 0
    End Function
    Public Function CommProc() As Long
    Dim os As OVERLAPPED
    Dim dwMask As Long
    Dim dwTrans As Long
    Dim ComState As COMSTAT
        os.hEvent = CreateEvent(0, 1, 0, vbNullString)
        If os.hEvent = 0 Then
            CommProc = -1
            Exit Function
        End If
        While (True)
            Call ClearCommError(m_hCom, COMSTAT)
            If COMSTAT.cbInQue > 0 Then
                Call WaitForSingleObject(m_hPostMsgEvent, INFINITE)
                Call ResetEvent(m_hPostMsgEvent)
                '通知视图
                'POSTMESSAGE
                'continue
            End If
            dwMask = 0
            If WaitCommEvent(m_hCom, dwMask, os) <> 0 Then
                If GetLastError = ERROR_IO_PENDING Then
                    Call GetOverlappedResult(m_hCom, os, dwTrans, True)
                Else
                    Call CloseHandle(os.hEvent)
                    CommProc = -1
                    Exit Function
                End If
            End If
        Wend
        Call CloseHandle(os.hEvent)
        CommProc = 0
    End Function
    Public Function ReadComm(ByRef outBuf As String, ByVal nlength As Long) As Long
        Dim length As Long
        Dim ComState As COMSTAT
        Dim nErrorFlag As Long
        Call ClearCommError(m_hCom, nErrorFlag, ComState)
        If nlength < ComState.cbInQue Then
            length = nlength
        Else
            length = ComState.cbInQue
        End If
        Call ReadFile(m_hCom, outBuf, length, length, m_osRead)
        ReadComm = length
    End Function
    Public Function WriteComm(ByRef inBuf As String, ByVal nlength As Long) As Long
        Dim bStat As Boolean
        Dim length  As Long
        length = nlength
        Dim ComState As COMSTAT
        Dim nErrorFlag As Long
        Call ClearCommError(m_hCom, nErrorFlag, ComState)
        bStat = WriteFile(m_hCom, inBuf, length, length, m_osWrite)
        If bStat = True Then
            If GetLastError = ERROR_IO_PENDING Then
                Call GetOverlappedResult(m_hCom, m_osWrite, length, True)
            Else
                length = 0
            End If
        End If
        WriteComm = length
    End Function