请教多串口卡通讯问题

sunxinyu 2010-01-29 08:13:52
最近买了个HUTONE的PCI扩的双串口卡(NJP)。VB做个界面,放置两个 MSCOMM控件, 连接两台设备。现在发现每运行一段时间后,就不能正常收发数据,只能重新启动PC或者注销重登陆后,才能恢复正常。

不知道有没有大侠用过类似的串口卡,或者遇到类似的问题,是如何解决的?? 希望大侠不吝赐教!!!


...全文
216 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dasdsdfdfd 2011-05-28
  • 打赏
  • 举报
回复
学习下
sunxinyu 2010-01-31
  • 打赏
  • 举报
回复
感谢楼上各位

@cmb666 ,我程序里用的是MSComm1_OnComm 和MSComm2_OnComm事件。
sunxinyu 2010-01-31
  • 打赏
  • 举报
回复
多谢cbm666及各位热心的朋友
cbm6666 2010-01-31
  • 打赏
  • 举报
回复
sTemp = MSComm1.Input '这行拿到上面
没有先取得 sTemp的值

你下面这行的sTemp要从那里来?
If InStr(1, sTemp, "rr") = 0 Then 'Or InStr(sTemp, ".") > InStr(sTemp, "N") then
cbm6666 2010-01-31
  • 打赏
  • 举报
回复
sTemp = MSComm1.Input '这行拿到上面

If InStr(1, sTemp, "rr") = 0 Then 'Or InStr(sTemp, ".") > InStr(sTemp, "N") then

sunxinyu 2010-01-31
  • 打赏
  • 举报
回复
Private Sub MSComm1_OnComm()
If SmartProperty.SmartItems.Item("UpLimit").Value = "" Then Exit Sub

Dim 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 String

Dim 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 Sub

errHandler:
Me.MSComm1.PortOpen = False
Me.MSComm1.InBufferCount = 0
Me.MSComm1.PortOpen = True

End Sub
qiangshou2301 2010-01-31
  • 打赏
  • 举报
回复
这种串口卡一般不好使 还是用屁股后面的硬串口
fouthu 2010-01-31
  • 打赏
  • 举报
回复
我是进来学习的。
cbm6666 2010-01-31
  • 打赏
  • 举报
回复
你把 MSComm1_OnComm 的代码贴出来看看 我经常在接4台-8台的电子秤 也不觉得卡....
贝隆 2010-01-30
  • 打赏
  • 举报
回复
既然你的PC是被动接受数据,那么你就最好使用OnComm事件方式来处理,楼主参考一下这个:
http://download.csdn.net/source/1262066

这是一个串口调试器的源代码,你可以借鉴,只需要把接收到的数据分段即可。
cbm6666 2010-01-29
  • 打赏
  • 举报
回复
你接收是使用 MSComm1_OnComm 事件吗?
sunxinyu 2010-01-29
  • 打赏
  • 举报
回复
多谢两位高人的指引。 有些信息我再补充一下:

PC被动接收数据。所以用轮询是不是不太合适?

询问过他们的技术支持, 他们说我用的NJP那款,板子上没有复位芯片。是不是没有复位芯片造成的呢?哎,真愁人,无奈了~~~~~~~~~~~
cbm6666 2010-01-29
  • 打赏
  • 举报
回复
只要 Mscomm1与Mscomm2都能 Open 成功 那就不是你双口卡的问题了,因为 ComPort并没问题.

应该是你的代码处理问题.
zdingyun 2010-01-29
  • 打赏
  • 举报
回复
将MSCOMM控件放独立窗体,由主窗体来定时关闭和打开窗体.

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧