我用VB写了一个COM口钱箱打开的程序,但会出现有时打不开.且在程序加上了错误判断的,没有任何错误提示.
用API写那该如何去调用.打开COM口和发送数据.
用API写那该如何去调用.打开COM口和发送数据.
解决方案 »
- 请问:vb如何访问mysql
- 如何实现vb中文本框、下拉菜单内容的保留?先谢了
- [求助 VB] ACCESS数据库读取到ListView 里显示问题
- 帮小弟个忙,我会给分给大家的!谢谢了!:)
- 求教打印的问题??
- 我想知道如何增删改表的索引
- 如何打字程序一样,在文本框中输入字,对是一种颜色,错是另一种颜色!
- 高分求救!关于vsflexgrid的bookmark属性的用法!
- 有谁知道sourcesafe中如何实现两文本的Show Differences??
- 向各位高手请教如何修改Setup1.vbp来加入序列号?
- 如何将access的数据导入到sql库中
- Webbrowser打开网站的时候,可以不下载图片吗?
1.有没有考虑到单片机数据处理能力?你发送数据不可能太快
2.通讯线是不是不稳定?
mscom在发送数据和接收数据实在是难以控制自如;但mscom在初始化串口的波特率却是很好的;
API 有些厂商或个人写的DLL 也不是十全十美的;到目前我不般不用个人写的DLL 可靠性不大;
个别厂商写的DLL 也不是技术很成熟;我建议楼主用台湾磨沙的DLL (pccomm.dll) 与串口通讯;台湾人的东西就是好,呵呵;
做过考勤机,食堂售饭机的后台软件和下位机的单片机程序,
做过超市POS系统;有空去我公司的网站上看看:
www.xherp.com
我觉得vb用mscom控件应该可以做得很好的,你说有时打不开,原因可能有:
1. 波特率太高(钱箱的可以设置吗)
2. 线路质量差(劣质线?线路太长?有没有线路转换,比如转RS485,光隔离吗?)
3. 钱箱响应时间(处理能力可能超出预料)
4. 通讯是不是应答式的(这可是mscom控件的弱项)
...
(单位里买了一个USB转串口的东东,双机测试百分百成功,可是拿到变频器试就是不行?)
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