请教多串口卡通讯问题 最近买了个HUTONE的PCI扩的双串口卡(NJP)。VB做个界面,放置两个 MSCOMM控件, 连接两台设备。现在发现每运行一段时间后,就不能正常收发数据,只能重新启动PC或者注销重登陆后,才能恢复正常。不知道有没有大侠用过类似的串口卡,或者遇到类似的问题,是如何解决的?? 希望大侠不吝赐教!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 将MSCOMM控件放独立窗体,由主窗体来定时关闭和打开窗体. 只要 Mscomm1与Mscomm2都能 Open 成功 那就不是你双口卡的问题了,因为 ComPort并没问题.应该是你的代码处理问题. 多谢两位高人的指引。 有些信息我再补充一下: PC被动接收数据。所以用轮询是不是不太合适?询问过他们的技术支持, 他们说我用的NJP那款,板子上没有复位芯片。是不是没有复位芯片造成的呢?哎,真愁人,无奈了~~~~~~~~~~~ 你接收是使用 MSComm1_OnComm 事件吗? 既然你的PC是被动接受数据,那么你就最好使用OnComm事件方式来处理,楼主参考一下这个:http://download.csdn.net/source/1262066这是一个串口调试器的源代码,你可以借鉴,只需要把接收到的数据分段即可。 感谢楼上各位@cmb666 ,我程序里用的是MSComm1_OnComm 和MSComm2_OnComm事件。 你把 MSComm1_OnComm 的代码贴出来看看 我经常在接4台-8台的电子秤 也不觉得卡.... Private Sub MSComm1_OnComm()If SmartProperty.SmartItems.Item("UpLimit").Value = "" Then Exit SubDim sTemp As StringDim sReceive As StringDim iPos As IntegerDim strPart1_Sign As StringDim strPart2_Wgt As StringDim strPart3_Unit As StringDim ddd As LongOn Error GoTo errHandler sReceive = "" MSComm1.InputLen = 22 Select Case MSComm1.CommEvent Case comEvReceive '接收到22个数据 If InStr(1, sTemp, "rr") = 0 Then 'Or InStr(sTemp, ".") > InStr(sTemp, "N") Then sTemp = MSComm1.Input If VBA.Mid(sTemp, 1, 1) = " " And InStr(1, sTemp, "g") <> 0 Then GoTo errHandler strPart1_Sign = VBA.Trim(VBA.Mid(sTemp, 7, 1)) strPart2_Wgt = VBA.Trim(VBA.Mid(sTemp, 9, 8)) strPart3_Unit = VBA.Trim(VBA.Mid(sTemp, 18, 3)) 'sReceive = strPart1_Sign & strPart2_Wgt & strPart3_Unit If intWeighingStep = 1 Then txtTare.Text = strPart2_Wgt 'sReceive dblTare = txtTare.Text SmartTabStrip_Click SmartTabStrip.SmartItems.Item("皮重称量") SmartTabStrip.SmartItems.Item("皮重称量").Visibility = viVisible SmartTabStrip.SmartItems.Item("皮重称量").Selected = True intWeighingStep = 2 If bAudio = True Then ddd = SmartRead_Speak("当前皮重是" & txtTare.Text & "千克 请放入净重,并在稳定后按打印键!", 11, 0, -1, -1, 1, "http://www.smartread.net/cn/index.html") End If ElseIf intWeighingStep = 2 Then txtNET.Text = strPart2_Wgt 'sReceive txtNET.Text = Format(txtNET.Text, "0.000") dblNet = txtNET.Text SmartTabStrip_Click SmartTabStrip.SmartItems.Item("净重称量") SmartTabStrip.SmartItems.Item("净重称量").Visibility = viVisible SmartTabStrip.SmartItems.Item("净重称量").Selected = True intWeighingStep = 3 txtNetTare.Text = Format(Val(txtNET.Text) + Val(txtTare.Text), "0.000") If bAudio = True Then ddd = SmartRead_Speak("当前净重是" & txtNET.Text & "千克 请将装完物质的容器放入复核秤,并在稳定后按打印键!", 11, 0, -1, -1, 1, "http://www.smartread.net/cn/index.html") End If End If End If Case comRxParity '接收错误 MsgBox "提示: 通 信 格 式 错 ! " End Select MSComm1.InBufferCount = 0 '接收缓冲区清零 Exit SuberrHandler: Me.MSComm1.PortOpen = False Me.MSComm1.InBufferCount = 0 Me.MSComm1.PortOpen = TrueEnd Sub sTemp = MSComm1.Input '这行拿到上面 If InStr(1, sTemp, "rr") = 0 Then 'Or InStr(sTemp, ".") > InStr(sTemp, "N") then sTemp = MSComm1.Input '这行拿到上面 没有先取得 sTemp的值你下面这行的sTemp要从那里来?If InStr(1, sTemp, "rr") = 0 Then 'Or InStr(sTemp, ".") > InStr(sTemp, "N") then 多谢cbm666及各位热心的朋友 CombineRgn组合的区域不知道如何释放,实在是找不到了,请大家帮帮忙 ActiveX中用到第三方Ocx控件,然后将ActionX发布的站上去,无法显示 vb反编译工具 ifix中不能直接用GetSetting吗? 关于数据库的两点问题 高手求救!!!!!关于api的。 求助做外挂方法,急 TreeView关于图像的问题? 200分,怎样把菜单的字体放大成5号,UP者有分 VB真的没有前景了吗? 大家请看一个sendmessage问题 filelistbox控件,如何实现什么文件也不显示呀?即初始状态为空
http://download.csdn.net/source/1262066这是一个串口调试器的源代码,你可以借鉴,只需要把接收到的数据分段即可。
If SmartProperty.SmartItems.Item("UpLimit").Value = "" Then Exit SubDim sTemp As String
Dim sReceive As String
Dim iPos As Integer
Dim strPart1_Sign As String
Dim strPart2_Wgt As String
Dim strPart3_Unit As StringDim ddd As Long
On Error GoTo errHandler
sReceive = ""
MSComm1.InputLen = 22 Select Case MSComm1.CommEvent
Case comEvReceive '接收到22个数据
If InStr(1, sTemp, "rr") = 0 Then 'Or InStr(sTemp, ".") > InStr(sTemp, "N") Then
sTemp = MSComm1.Input
If VBA.Mid(sTemp, 1, 1) = " " And InStr(1, sTemp, "g") <> 0 Then GoTo errHandler
strPart1_Sign = VBA.Trim(VBA.Mid(sTemp, 7, 1))
strPart2_Wgt = VBA.Trim(VBA.Mid(sTemp, 9, 8))
strPart3_Unit = VBA.Trim(VBA.Mid(sTemp, 18, 3)) 'sReceive = strPart1_Sign & strPart2_Wgt & strPart3_Unit If intWeighingStep = 1 Then
txtTare.Text = strPart2_Wgt 'sReceive
dblTare = txtTare.Text SmartTabStrip_Click SmartTabStrip.SmartItems.Item("皮重称量")
SmartTabStrip.SmartItems.Item("皮重称量").Visibility = viVisible
SmartTabStrip.SmartItems.Item("皮重称量").Selected = True
intWeighingStep = 2
If bAudio = True Then
ddd = SmartRead_Speak("当前皮重是" & txtTare.Text & "千克 请放入净重,并在稳定后按打印键!", 11, 0, -1, -1, 1, "http://www.smartread.net/cn/index.html")
End If
ElseIf intWeighingStep = 2 Then txtNET.Text = strPart2_Wgt 'sReceive
txtNET.Text = Format(txtNET.Text, "0.000")
dblNet = txtNET.Text
SmartTabStrip_Click SmartTabStrip.SmartItems.Item("净重称量")
SmartTabStrip.SmartItems.Item("净重称量").Visibility = viVisible
SmartTabStrip.SmartItems.Item("净重称量").Selected = True
intWeighingStep = 3
txtNetTare.Text = Format(Val(txtNET.Text) + Val(txtTare.Text), "0.000")
If bAudio = True Then
ddd = SmartRead_Speak("当前净重是" & txtNET.Text & "千克 请将装完物质的容器放入复核秤,并在稳定后按打印键!", 11, 0, -1, -1, 1, "http://www.smartread.net/cn/index.html")
End If
End If
End If Case comRxParity '接收错误 MsgBox "提示: 通 信 格 式 错 ! "
End Select MSComm1.InBufferCount = 0 '接收缓冲区清零
Exit SuberrHandler:
Me.MSComm1.PortOpen = False
Me.MSComm1.InBufferCount = 0
Me.MSComm1.PortOpen = TrueEnd Sub
没有先取得 sTemp的值你下面这行的sTemp要从那里来?
If InStr(1, sTemp, "rr") = 0 Then 'Or InStr(sTemp, ".") > InStr(sTemp, "N") then