Private Function FutComm(Cmd As String, OutputD As String, GDLen As Long, DelayS As Single) As String On Error GoTo Out Dim Dou1 As Double Comm1.InBufferCount = 0: Comm1.OutBufferCount = 0 '初始化缓冲区 If Comm1.PortOpen = False Then Comm1.PortOpen = True '打开串口 Dou1 = Timer '初始化定时,计秒 Comm1.Output = Cmd & "00" & OutputD & vbCr '发送GMAX+00+回车指令'等候,直到"接收缓冲区接收字节数不小于GDLEN"或者"时间超多DelayS秒" Do While Comm1.InBufferCount < GDLen And Timer - Dou1 < DelayS DoEvents '执行过程外其它事件 If Proj.End Then End 'Proj的END成员为真时,退出工程 'If Process.StopBL Then GoTo Out Loop FutComm = Comm1.Input '返回接受缓冲区中所有字节 Exit Function Out: '如果发生错误返回空字符串 FutComm = "" End Function 说明:Comm1是一个COMM控件 GMAX命令: GMAX <address> <CR> Get Maximum V & C | 'GMAX指令格式:CMAX+地址+回车 | Voltage [???] Current [???] [CR] | | [OK] [CR] 返回数值格式:XXXYYY+回车+OK+回车 共10个字节.前三个组成电压值,后三个组成电流值,之后是回车,OK,再接回车 ------------------------------------------------------------------ 此函数确实不够可靠.通讯异常\其它错误\下位机没工作\等等异常都要导致返回空字符串,串口通讯应该明确超时错误,这是基本规矩.而且延迟等待不是COMM控件最佳应用方案.支持2楼主张,从新构架程序.但碍于楼主要求,还是加了足够的注解,供参考.
Private Function FutComm(Cmd As String, OutputD As String, GDLen As Long, DelayS As Single) As String On Error GoTo Out Dim Dou1 As Double Comm1.InBufferCount = 0: Comm1.OutBufferCount = 0 '初始化缓冲区 If Comm1.PortOpen = False Then Comm1.PortOpen = True '打开串口 Dou1 = Timer '初始化定时,计秒 Comm1.Output = Cmd & "00" & OutputD & vbCr '发送GMAX+00+回车指令'等候,直到"接收缓冲区接收字节数不小于GDLEN"或者"时间超多DelayS秒" Do While Comm1.InBufferCount < GDLen And Timer - Dou1 < DelayS DoEvents '执行过程外其它事件 If Proj.End Then End 'Proj的END成员为真时,退出工程 'If Process.StopBL Then GoTo Out Loop FutComm = Comm1.Input '返回接受缓冲区中所有字节 Exit Function Out: '如果发生错误返回空字符串 FutComm = "" End Function 说明:Comm1是一个COMM控件 GMAX命令: GMAX <address> <CR> Get Maximum V & C | 'GMAX指令格式:CMAX+地址+回车 | Voltage [???] Current [???] [CR] | | [OK] [CR] 返回数值格式:XXXYYY+回车+OK+回车 共10个字节.前三个组成电压值,后三个组成电流值,之后是回车,OK,再接回车 ------------------------------------------------------------------ 此函数确实不够可靠.通讯异常\其它错误\下位机没工作\等等异常都要导致返回空字符串,串口通讯应该明确超时错误,这是基本规矩.而且延迟等待不是COMM控件最佳应用方案.支持2楼主张,从新构架程序.但碍于楼主要求,还是加了足够的注解,供参考.
给你一个:http://download.csdn.net/source/1262066
On Error GoTo Out
Dim Dou1 As Double
Comm1.InBufferCount = 0: Comm1.OutBufferCount = 0 '初始化缓冲区
If Comm1.PortOpen = False Then Comm1.PortOpen = True '打开串口
Dou1 = Timer '初始化定时,计秒
Comm1.Output = Cmd & "00" & OutputD & vbCr '发送GMAX+00+回车指令'等候,直到"接收缓冲区接收字节数不小于GDLEN"或者"时间超多DelayS秒"
Do While Comm1.InBufferCount < GDLen And Timer - Dou1 < DelayS
DoEvents '执行过程外其它事件
If Proj.End Then End 'Proj的END成员为真时,退出工程
'If Process.StopBL Then GoTo Out
Loop
FutComm = Comm1.Input '返回接受缓冲区中所有字节
Exit Function Out: '如果发生错误返回空字符串
FutComm = ""
End Function
说明:Comm1是一个COMM控件
GMAX命令: GMAX <address> <CR> Get Maximum V & C | 'GMAX指令格式:CMAX+地址+回车
| Voltage [???] Current [???] [CR] |
| [OK] [CR]
返回数值格式:XXXYYY+回车+OK+回车 共10个字节.前三个组成电压值,后三个组成电流值,之后是回车,OK,再接回车
------------------------------------------------------------------
此函数确实不够可靠.通讯异常\其它错误\下位机没工作\等等异常都要导致返回空字符串,串口通讯应该明确超时错误,这是基本规矩.而且延迟等待不是COMM控件最佳应用方案.支持2楼主张,从新构架程序.但碍于楼主要求,还是加了足够的注解,供参考.
On Error GoTo Out
Dim Dou1 As Double
Comm1.InBufferCount = 0: Comm1.OutBufferCount = 0 '初始化缓冲区
If Comm1.PortOpen = False Then Comm1.PortOpen = True '打开串口
Dou1 = Timer '初始化定时,计秒
Comm1.Output = Cmd & "00" & OutputD & vbCr '发送GMAX+00+回车指令'等候,直到"接收缓冲区接收字节数不小于GDLEN"或者"时间超多DelayS秒"
Do While Comm1.InBufferCount < GDLen And Timer - Dou1 < DelayS
DoEvents '执行过程外其它事件
If Proj.End Then End 'Proj的END成员为真时,退出工程
'If Process.StopBL Then GoTo Out
Loop
FutComm = Comm1.Input '返回接受缓冲区中所有字节
Exit Function Out: '如果发生错误返回空字符串
FutComm = ""
End Function
说明:Comm1是一个COMM控件
GMAX命令: GMAX <address> <CR> Get Maximum V & C | 'GMAX指令格式:CMAX+地址+回车
| Voltage [???] Current [???] [CR] |
| [OK] [CR]
返回数值格式:XXXYYY+回车+OK+回车 共10个字节.前三个组成电压值,后三个组成电流值,之后是回车,OK,再接回车
------------------------------------------------------------------
此函数确实不够可靠.通讯异常\其它错误\下位机没工作\等等异常都要导致返回空字符串,串口通讯应该明确超时错误,这是基本规矩.而且延迟等待不是COMM控件最佳应用方案.支持2楼主张,从新构架程序.但碍于楼主要求,还是加了足够的注解,供参考.