VB串口通信问题,急!!!!

panpan1202 2009-12-28 06:06:35
现有电子秤一台,使用串口与计算机进行通讯。编写VB程序来访问串口,达到读取电子秤上显示的数据。该电子秤为BL-4100S型仪表,输出为RS-232标准接口,波特率为2400、无校验,数据格式为:1 起始位 8 数据位(包括校验)1 停止位 。
现在想在电脑中每隔一定的时间间隔记录电子称数据,以十进制形式显示在文本中,记录形式为:(时间,质量)
以前根本没有学过VB,现在遇到这个问题,所以就在网上搜了一个程序,想自己先试着理解下VB中关于串口通讯的问题,程序如下:
Option Explicit
Dim strss As String

Private Sub Command1_Click() '开始接收
Label1.Caption = " "
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
If MSComm1.PortOpen = False Then
MSComm1.CommPort = 1 '串口号,
MSComm1.Settings = "2400,n,8,1 " '串口的属性
MSComm1.InputLen = 0
MSComm1.RThreshold = 10
MSComm1.InputMode = comInputModeText
MSComm1.PortOpen = True '打开通信串口
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
End If
Print MSComm1.PortOpen
End Sub

Private Sub MSComm1_OnComm()
Dim k, i, j As Integer
'Dim myarray() As Byte既然以文本模式接收,则无须用Byte数组来获取数据
Select Case MSComm1.CommEvent
Case comEvReceive
k = MSComm1.InBufferCount
If k = 0 Then
Exit Sub
End If
ReDim myarray(k - 1)
strss = MSComm1.Input
'j = 0
'For i = 0 To UBound(myarray) ' ' ' ' ' '每一组为10 个字节
'j = j + 1
'strss = strss & Chr(myarray(i))
'If j = 10 Then
Label1.Caption = Val(Mid(StrReverse(strss), 2, 8))
strss = ""
'j = 0
'End If
'Next





Case comEvSend
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
End Select
End Sub

Private Sub Command2_Click() '停止接收
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
End Sub



点击VB界面“启动”后,我点击command1 然后在form1窗口出现true
然后就没有反应了
这是什么问题?
如果想达到我上述的目的,文本记录质量随时间变化这样的形式,有没有人帮忙写下代码?非常感谢!!





...全文
334 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
newtonprincess 2010-12-09
  • 打赏
  • 举报
回复
楼主,我也遇到同样问题,请问你是怎么解决的啊?跪求答案,方便留的联系方式吗?我QQ是275173368,麻烦帮帮忙。
panpan1202 2010-01-05
  • 打赏
  • 举报
回复
可以的 读书很正确 非常感谢啊
stayor 2009-12-30
  • 打赏
  • 举报
回复
所谓读取电子称,其实是电子称主动发送数据,电脑是否接收而已。
如果用“串口调试工具”,串口参数设置正确的情况下。
如果没有接收到数据,则是电子称根本没法数据。
zdingyun 2009-12-30
  • 打赏
  • 举报
回复
LZ:除数据字节长与你在另一帖描述的略有差异,看来询问指令是字符"#",或16进制的0X23,以下是按字符接收的代码:
Option Explicit
Dim strss As String

Private Sub Command1_Click() '发送
Dim strSend As String
strSend = "#"
MSComm1.Output = strSend
End Sub

Private Sub Form_Load()
MSComm1.CommPort = 1 '串口号,
MSComm1.Settings = "2400,n,8,1 " '串口的属性
MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeText
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
strss = strss & MSComm1.Input
If Right(strss, 2) = vbCrLf Then
Label1.Caption = strss
strss = ""
End If
End Select
End Sub

Private Sub Command2_Click() '停止接收
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
End Sub
panpan1202 2009-12-30
  • 打赏
  • 举报
回复
天呢,终于有点进展了,非常非常感谢大家的帮助啊,谢谢!下边是串口调试
收到的十六进制信号:
20 20 20 2B 36 38 2E 35 37 20 20 47 53 0D 0A
对不对?
chinaboyzyq 2009-12-30
  • 打赏
  • 举报
回复
楼主要搞清楚以下内容:
1、电子秤与串口通讯是采用的文本方式,还是二进制方式?(MSComm1.InputMode = ?)
2、电子秤每次给串口发送多少个字符或字节?(MSComm1.RThreshold = ?)
3、电子秤是否已经给串口发送了数据?(先测试串口有没有问题?http://download.csdn.net/source/1626094串口调试助手)
4、接线方式是否正确,很多时候下位机与上位通讯的rs-232的第2线和第3线是交叉的。
panpan1202 2009-12-30
  • 打赏
  • 举报
回复
那应该如何调?用万能表检查了我自己购买的RS232延长线,1-1,2-2,。。。9-9分别连,是连通的啊
panpan1202 2009-12-29
  • 打赏
  • 举报
回复
我把程序下载下来了,然后启动运行,在发送字符栏随便输入了几个字符,只看到发送字节在变化,但显示栏什么都没有?这是什么问题

这回我电脑和电子称在连接状态
贝隆 2009-12-28
  • 打赏
  • 举报
回复
楼主,调试串口通信,建议先使用串口调试器调试,调通了再写自己的程序。
还有,需要提供一下你的通信协议,看看这个吧,应该对你有用。
http://download.csdn.net/source/1262066
gzhjic 2009-12-28
  • 打赏
  • 举报
回复
lable1是接收电子秤的数据,试试用串口调试助手看看有无数据,或者先如zdingyun说的提供该电子秤BL-4100S型仪表的通信协议和数据帧约定说明。
Private Sub Form_Load()
With MSComm1
.CommPort = 1
.Settings = "2400,N,8,1"
.InputLen = 0
.RThreshold = 1
.PortOpen = True
End With
End Sub
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
strData = MSComm1.Input
Text1 = Text1 + strData
End Select
End Sub

这段代码试试也行。
zdingyun 2009-12-28
  • 打赏
  • 举报
回复
LZ将
MSComm1.RThreshold = 10
修改为:
MSComm1.RThreshold = 1
将:
strss = MSComm1.Input
修改为:
strss = strss & MSComm1.Input
再看看你的Label1中显示啥?
panpan1202 2009-12-28
  • 打赏
  • 举报
回复
就是按照3楼修改后还是没啥反应的
panpan1202 2009-12-28
  • 打赏
  • 举报
回复
lable1没有反应 就是说启动后点command1 就在form1界面出现true
别的就什么也没有
不过楼上能否解释下lable1在代码中是起什么作用?
gzhjic 2009-12-28
  • 打赏
  • 举报
回复

Dim strss As String
Private Sub Command1_Click()
Label1.Caption = " "
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
If MSComm1.PortOpen = False Then
MSComm1.CommPort = 1 '串口号,
MSComm1.Settings = "2400,n,8,1 " '串口的属性
MSComm1.InputLen = 0
MSComm1.RThreshold = 10
MSComm1.InputMode = comInputModeText
MSComm1.PortOpen = True '打开通信串口
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
End If
Print MSComm1.PortOpen
End Sub


Private Sub MSComm1_OnComm()
Dim k, i, j As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
strss = MSComm1.Input
Label1.Caption = strss
strss = ""
Case comEvSend
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
End Select
End Sub

先这样做,看label1有没反应,排除协议对不对。
zdingyun 2009-12-28
  • 打赏
  • 举报
回复
LZ:你的代码可以接收来自长度为10字节的数据.
看你的问题,你应该提供该电子秤BL-4100S型仪表的通信协议和数据帧约定说明.

7,763

社区成员

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

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