需要和客户的产品通讯,但波特率是非常规的,MScomm无法实现,原有的软件框架和条件又不能转用VC开发底层,于是用VB6调用API实现了这个通讯功能,虽然在VB6下这个程序还是单进程的,但实现了异步非阻塞的通信,性能相当稳定,下面是测试程序代码
Private
Sub cmdSend_Click()
Sub cmdSend_Click()
'定义文件读写属性结构
Dim sa As SECURITY_ATTRIBUTES
'定义串口状态结构
Dim typCommStat As COMSTAT
'定义串口状态错误
Dim lngError As Long
'********打开串口********
Dim hCF As Long
hCF = CreateFile("COM4", _
GENERIC_READ Or GENERIC_WRITE, 0, sa, _
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED, 0)
Debug.Print "打开串口:" & hCF
'********获取出错信息********
Dim errNum As Long
errNum = GetLastError()
Debug.Print "出错信息:" & errNum
'定义标志值
Dim flag As Long
'定义设备控制块
Dim typDCB As DCB
'********获取设备控制块********
flag = GetCommState(hCF, typDCB)
Debug.Print "获取串口DCB:" & flag
typDCB.BaudRate = 2500 '定义波特率
typDCB.Parity = NOPARITY '无校验位
typDCB.ByteSize = 8 '数据位
typDCB.StopBits = 0 '停止位 0/1/2 = 1/1.5/2
'********设置串口参数********
flag = SetCommState(hCF, typDCB)
Debug.Print "设置串口参数:" & flag
'********设置缓冲区大小********
flag = SetupComm(hCF, 1024, 1024)
'Debug.Print "设置缓冲区:" & flag
'********清空读写缓冲区********
flag = PurgeComm(hCF, PURGE_RXABORT Or PURGE_RXCLEAR Or PURGE_TXABORT Or PURGE_TXCLEAR)
'Debug.Print "强制清空缓冲区:" & flag
'定义超时结构体
Dim typCommTimeouts As COMMTIMEOUTS
typCommTimeouts.ReadIntervalTimeout = 0 '相邻两字节读取最大时间间隔(为0表示不使用该超时间隔)
typCommTimeouts.ReadTotalTimeoutMultiplier = 0 '一个读操作的时间常数
typCommTimeouts.ReadTotalTimeoutConstant = 0 '读超时常数
typCommTimeouts.WriteTotalTimeoutMultiplier =
'定义文件读写属性结构
Dim sa As SECURITY_ATTRIBUTES
'定义串口状态结构
Dim typCommStat As COMSTAT
'定义串口状态错误
Dim lngError As Long
'********打开串口********
Dim hCF As Long
hCF = CreateFile("COM4", _
GENERIC_READ Or GENERIC_WRITE, 0, sa, _
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED, 0)
Debug.Print "打开串口:" & hCF
'********获取出错信息********
Dim errNum As Long
errNum = GetLastError()
Debug.Print "出错信息:" & errNum
'定义标志值
Dim flag As Long
'定义设备控制块
Dim typDCB As DCB
'********获取设备控制块********
flag = GetCommState(hCF, typDCB)
Debug.Print "获取串口DCB:" & flag
typDCB.BaudRate = 2500 '定义波特率
typDCB.Parity = NOPARITY '无校验位
typDCB.ByteSize = 8 '数据位
typDCB.StopBits = 0 '停止位 0/1/2 = 1/1.5/2
'********设置串口参数********
flag = SetCommState(hCF, typDCB)
Debug.Print "设置串口参数:" & flag
'********设置缓冲区大小********
flag = SetupComm(hCF, 1024, 1024)
'Debug.Print "设置缓冲区:" & flag
'********清空读写缓冲区********
flag = PurgeComm(hCF, PURGE_RXABORT Or PURGE_RXCLEAR Or PURGE_TXABORT Or PURGE_TXCLEAR)
'Debug.Print "强制清空缓冲区:" & flag
'定义超时结构体
Dim typCommTimeouts As COMMTIMEOUTS
typCommTimeouts.ReadIntervalTimeout = 0 '相邻两字节读取最大时间间隔(为0表示不使用该超时间隔)
typCommTimeouts.ReadTotalTimeoutMultiplier = 0 '一个读操作的时间常数
typCommTimeouts.ReadTotalTimeoutConstant = 0 '读超时常数
typCommTimeouts.WriteTotalTimeoutMultiplier =