想把电子称和电脑连接起来,电脑每隔几个毫秒记录数据,数据要求是十进制,并保存在TXT文本中,期望能绘出质量-时间曲线。现在已经连接好了,但是我没有学过VB,自己找了好多例子研究了好久,还是有很多问题不懂,按例子改写后实验,还是不行,可能我对这个串口通信不理解,改写后也总是有问题。下边是我的电子称说明书,不知有没有VB高手根据我的实际情况帮我编写符合要求能在电脑上保存数据的代码,非常感谢!一、利用立即打印符来接收数据
当天平与计算机相连时,建议使用立即打印符“#”进行数据输出,当响应此命令后,天平立即把其显示的所有数字或者信息以字符串的形式输出出来。
其输出格式如下:
+/- 1 2 3 4 5 6. C0 C1 C2 C3 CR LF
前六个数字区,数字前通常还有符号(+或-),小数点也被传输。数字少于六位时由空格来补充(如有其它信息传输,则位于数字区)
注:小数点的位置取决于天平显示的分辨率及单位,第一个数字紧接在符号之后。
C0:空格
C1:如果天平被设置为“自动”响应模式,它亦为一个空格。
如果天平响应模式为“快速”,C1=F
如果天平响应模式为“慢速”,C1=S
C2: 表示所传输的数字的单位,如称重单位为克,则传送g
C3:代表稳定性,其功能与天平显示的“OK”功能相同,空格表示所传数字不稳定,“S”表示所传数字稳定。立即打印输出时,C3后边还跟有一个回车和一个换行符,如果天平已设置了其它换行数,它们和回车符一起传送。二、RS232接口硬件
虽然BL系列电子天平可与任何具有RS232接口的设备相连,但其接口并未采用RS232的所有通讯协议,它仅使用了标准接口的数据传输和接收线,但在许多应用中一般不会带来任何接口问题。
数据格式:
1 起始位
8 数据位(包括校验)
1 停止位
注:BL天平将以选定的检验形式传输数据,但它并不对收到的校验进行检验,请用RS232电缆将BL天平与外部设备相连或者按下面的说明来连线。 1 2 3 4 5 PIN 功能
o o o o o 2 TXD-天平数据发送线
o o o o 3 RXD-天平数据接收线
6 7 8 9 5 GND-地
此外,对于需要握手信号的计算机,为了能与BL系列天平进行通信,应将计算机RS232接口上的DTR、DSR和CTS与RTS分别短接在一起。 建议使用电缆长度不超过15m,如电缆电容《2,500PF,电缆还可适当长一些。所接负载的阻抗应介于
当天平与计算机相连时,建议使用立即打印符“#”进行数据输出,当响应此命令后,天平立即把其显示的所有数字或者信息以字符串的形式输出出来。
其输出格式如下:
+/- 1 2 3 4 5 6. C0 C1 C2 C3 CR LF
前六个数字区,数字前通常还有符号(+或-),小数点也被传输。数字少于六位时由空格来补充(如有其它信息传输,则位于数字区)
注:小数点的位置取决于天平显示的分辨率及单位,第一个数字紧接在符号之后。
C0:空格
C1:如果天平被设置为“自动”响应模式,它亦为一个空格。
如果天平响应模式为“快速”,C1=F
如果天平响应模式为“慢速”,C1=S
C2: 表示所传输的数字的单位,如称重单位为克,则传送g
C3:代表稳定性,其功能与天平显示的“OK”功能相同,空格表示所传数字不稳定,“S”表示所传数字稳定。立即打印输出时,C3后边还跟有一个回车和一个换行符,如果天平已设置了其它换行数,它们和回车符一起传送。二、RS232接口硬件
虽然BL系列电子天平可与任何具有RS232接口的设备相连,但其接口并未采用RS232的所有通讯协议,它仅使用了标准接口的数据传输和接收线,但在许多应用中一般不会带来任何接口问题。
数据格式:
1 起始位
8 数据位(包括校验)
1 停止位
注:BL天平将以选定的检验形式传输数据,但它并不对收到的校验进行检验,请用RS232电缆将BL天平与外部设备相连或者按下面的说明来连线。 1 2 3 4 5 PIN 功能
o o o o o 2 TXD-天平数据发送线
o o o o 3 RXD-天平数据接收线
6 7 8 9 5 GND-地
此外,对于需要握手信号的计算机,为了能与BL系列天平进行通信,应将计算机RS232接口上的DTR、DSR和CTS与RTS分别短接在一起。 建议使用电缆长度不超过15m,如电缆电容《2,500PF,电缆还可适当长一些。所接负载的阻抗应介于
我刚刚看到后就试了,很好,哎,自己弄好久,还不如及时看帖子,非常感谢!虽然一次只能显示一个数据,并且要手动点击,跟要求还有点距离
Option Explicit
Dim strss As StringPrivate Sub Command1_Click() '发送
Dim strSend As String
strSend = "#"
MSComm1.Output = strSend
End SubPrivate Sub Form_Load()
MSComm1.CommPort = 1 '串口号,
MSComm1.Settings = "2400,n,8,1 " '串口的属性
MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeText
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
Timer1.Interval = 100
Timer1.Enabled = True
End SubPrivate Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
strss = strss & MSComm1.Input
If Right(strss, 2) = vbCrLf Then
Label1.Caption = strss
Open App.Path & "\DATA.txt" For Append As #1
Print #1, strss
Close
strss = ""
End If
End Select
End SubPrivate Sub Command2_Click() '停止接收
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
End SubPrivate Sub Timer1_Timer()
Command1_Click
End Sub
data文件中出现 +0.00 GS +0.00 GS +69.17 G +69.16 GS +69.17 GS
也就是说首次出现69.17这个数 它后边只有G,按道理应该还是GS吧,虽然对数据没有影响,这是为什么?还有,数据之间空的距离较大?不是应该紧密排列吗?我运行时把时间间隔为5000ms
第二,当点击command2时,程序出现错误:实时错误“8018”,只有当端口打开时,操作有效。然后点击调试,程序语句MSComm1.Output = strSend被涂成黄色(不知怎样上传图片,所以就描述下)
C3:代表稳定性,其功能与天平显示的“OK”功能相同,空格表示所传数字不稳定,,“S”表示所传数字稳定。立即打印输出时,C3后边还跟有一个回车和一个换行符,如果天平已设置了其它换行数,它们和回车符一起传送。
代码可修改为:
Option Explicit
Dim strss As StringPrivate Sub Form_Load()
MSComm1.CommPort = 1 '串口号,
MSComm1.Settings = "2400,n,8,1 " '串口的属性
MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeText
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
Timer1.Interval = 100
Timer1.Enabled = True
End SubPrivate Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
strss = strss & MSComm1.Input
If Right(strss, 2) = vbCrLf Then
Label1.Caption = strss
Open App.Path & "\DATA.txt" For Append As #1
Print #1, strss
Close
strss = ""
End If
End Select
End SubPrivate Sub Command2_Click() '停止接收
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
End SubPrivate Sub Timer1_Timer() '连续发送
Dim strSend As String
strSend = "#"
MSComm1.Output = strSend
End Sub
和上边那个代码是一样的
我的代码无Command2按钮!
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
End Sub
怎么没有?
Option Explicit
Dim strss As StringPrivate Sub Form_Load()
MSComm1.CommPort = 1 '串口号,
MSComm1.Settings = "2400,n,8,1 " '串口的属性
MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeText
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
Timer1.Interval = 100
Timer1.Enabled = True
End SubPrivate Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
strss = strss & MSComm1.Input
If Right(strss, 2) = vbCrLf Then
Label1.Caption = strss
Open App.Path & "\DATA.txt" For Append As #1
Print #1, strss
Close
strss = ""
End If
End Select
End SubPrivate Sub Timer1_Timer() '连续发送
Dim strSend As String
strSend = "#"
If MSComm1.PortOpen = True Then
MSComm1.Output = strSend
End If
End Sub
设置Timer1.Interval = 100,则每100MS采集1次秤数据.
LZ提醒你下 最好别用USB转串口的通信方式 最好是直接电路上的9针对台式机后的9针(其实只要3针就可以,2-2,3-3,5-5)
为什么呢?因为转下,如果数据发送接收过快,容易丢失,以致你的VB程序死掉,都是有可能的,吾的亲身体会!
至于怎么发送,给你个例子(这是发送AA AA FF 06 31 0 0 0 FF,
格式:
标志字节(帧首) + 命令字节 + 数据参数字节 + 帧尾字节
2字节 2字节 4字节 1字节 Private Sub Form_Load()
MSComm1.CommPort = port
MSComm1.Settings = setting
End Sub
Private Sub Command1_Click()
Dim lngP As long
Dim buff_out10() As Byte
ReDim buff_out10(8)
MSComm1.Settings = "9600,N,8,1" ' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.InputLen = 0
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If
buff_out10(0) = &HAA
buff_out10(1) = &HAA
buff_out10(2) = &HFF
buff_out10(3) = &H6
buff_out10(4) = &H31
buff_out10(5) = &H0
buff_out10(6) = &H0
buff_out10(7) = &H0
buff_out10(8) = &HFF
MSComm1.Output = buff_out10
lngP = GetTickCount 'API函数
Do
DoEvents
Loop Until GetTickCount - lngP > 100 Or MSComm1.InBufferCount > 10 '当等待时间超过100毫秒或串口接受缓冲区的数据达到10个字节时退出等待循环,这就是一个通信等待的过程。
DoEvents
End Sub
+0.00 GS +69.17 G +69.16 GS +69.17 GS
处理数据的时候很不方便,能不能把GS不要保存到文本中
而且把换行符去掉,只回车换行就可以了
不然空一行处理数据还得一个一个去掉 实在是太麻烦了
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
strss = strss & MSComm1.Input
If Right(strss, 2) = vbCrLf Then
Label1.Caption = strss
Open "D:\DATA.txt" For Append As #1
Print #1, Mid(strss, 1, Len(strss) - 2) '去除回车换行
Close
strss = ""
End If
End Select
End Sub
Select Case MSComm1.CommEvent
Case comEvReceive
strss = strss & MSComm1.Input
If Right(strss, 2) = vbCrLf Then
Label1.Caption = strss
Open "D:\DATA.txt" For Append As #1
Print #1, Mid(strss, 1, Len(strss) - 6) '去除回车换行
Close
strss = ""
End If
End Select
End Sub