问题1:在实际应用中,连接了SHINKO的电子天平,使用减重称量的方式记录每次减下重量,在减下物品的时候,因为风或触碰,所以需要判断重量稳定了才能记录结果,搞了多次测试了,感觉已经困在自己的逻辑里面了,求高手点醒!
问题2:VB.NET中的SerialPort 使用 ReadExisting 方法读取数据后,缓存区的数据还在吗?我用了 DataReceived 事件来触发 ReadExisting,现在得出的结果不是预期效果。
新人,无分,请高手不吝赐教!有代码最好!万分感谢!在线等。。。。
我用的是 VS2017 目标框架是 .NET Framework 2.0 语言是 VB
通过自己想办法已解决,分享下思路吧,让同样遭遇的人少走一些弯路:
1.延迟读取数据(我是通过调整触发DataReceived事件的字符串长度来弄的)
2.设置一个Boolean变量,用来标记此时的读数是否已经记录,
a.初始状态将这个变量的值设置为 False ,
b.每次记录后,将这个变量值更改为 True,
c.通过总结操作过程,自动记录当前重量时,当天平读取到一次当前重量时 0±0.02时,就标记这个变量的值为 false;同理自动记录重量差后,读取重量差文本框的读数是0±0.02时,标记变量为 false;在此代码下方执行判断后再决定是否记录读数到DGV中。
代码分享如下:
Private Sub TB_DQCZ_TextChanged(sender As Object, e As EventArgs) Handles TB_DQCZ.TextChanged
'Dim t As System.IO.StreamWriter = New System.IO.StreamWriter(RtxtPth, True, System.Text.Encoding.UTF8)
'当 当前称重 变化的时候
'计算并显示重量差
TB_ZLC.Text = Format(Str2Num(TB_SYCCZ.Text) - Str2Num(TB_DQCZ.Text), "0.000")
If CB_ZLQZ.Text = "当前重量" Then
If Str2Num(TB_DQCZ.Text) <= 0.02 Then
ZLYJL = False
End If
End If
If meLoaded = True And RB_zdms.Checked = True And RB_bzzd.Checked = True And CB_ZLQZ.Text = "当前重量" And AllowWritIn = True And Str2Num(TB_DQCZ.Text) > 0.02 And ZLYJL = False Then
WritWeightToDGV() '当前称重不是0 且当前重量未被记录
End If
End Sub
Private Sub TB_ZLC_TextChanged(sender As Object, e As EventArgs) Handles TB_ZLC.TextChanged
'当 重量差 有变化的时候
If CB_ZLQZ.Text = "重量差" Then
If Str2Num(TB_ZLC.Text) <= 0.02 Then
ZLYJL = False
Else
'ZLYJL = True
End If
End If
If meLoaded = True And RB_zdms.Checked = True And RB_bzzd.Checked = True And CB_ZLQZ.Text = "重量差" And AllowWritIn = True And Str2Num(TB_ZLC.Text) > 0.02 And ZLYJL = False Then
WritWeightToDGV() '当前称重不是0 且与上一次记录了的重量之差大于0.01
End If
End Sub
Private Sub TB_SYCCZ_TextChanged(sender As Object, e As EventArgs) Handles TB_SYCCZ.TextChanged
'显示重量差
TB_ZLC.Text = Format(Str2Num(TB_SYCCZ.Text) - Str2Num(TB_DQCZ.Text), "0.000")
End Sub
Private Sub WritWeightToDGV()
ZLYJL = True
Dim W As Decimal = 0
Select Case CB_ZLQZ.Text
Case "当前重量"
W = Str2Num(TB_DQCZ.Text) '记录当前称重及商品信息到 DGV 中
Case "重量差"
W = Str2Num(TB_ZLC.Text) '记录重量差及商品信息到 DGV 中
Case "输入重量"
W = Str2Num(TB_SRZL.Text) '记录输入重量及商品信息到 DGV 中
End Select
DGV_sj.Rows.Add()
DGV_sj.Rows(DGV_sj.RowCount - 2).Cells(DGV_sj_C_zl.Index).Value = Format(W, "0.000")
DGV_sj.FirstDisplayedScrollingRowIndex = DGV_sj.RowCount - 2
TB_SYCCZ.Text = TB_DQCZ.Text '将此次称重数据设为上次称重数据
'SYCJLZL = W
W = Nothing
End Sub
建议你用visual c++。visual basic并不适合做这个程序的。所以你是做不出来的。
补充说明一下最终目的:
1.天平稳定显示重量后,将天平上的重量数据自动记录物品重量到窗体中的 Datagridveiw控件中。
2.称重方式有两种:
a.一个称完去下后,再称下一个;
b.放一堆上去,一个一个取下来。
3.需要考虑的特殊情况:
a.在放物品和取物品的时候,可能会对电子天平有触碰;
b.因为都是称重的物品都比较小,最小的0.05g,所以放物品和取物品的时候,手风会有0.01到0.02克左右的影响。
目前窗体上的textbox控件已经能够与天平同步显示重量。问题就出在自动记录这个过程中,目前困在了自己的逻辑里面,不知道如何是好了。
下面是显示天平读数的代码:
Delegate Sub SetTextCallback(ByVal InputString As String)
Private Sub ShowString(ByVal comData As String)
TB_DQCZ.Text = 分离重量和单位(comData)(0) '显示当前称重数字
'CB_DYJLDW.Text = 分离重量和单位(comData)(1) '显示当前称重计量单位
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim inData As String = SerialPort1.ReadLine '读取缓冲区最新数据 'ReadExisting'
Dim d As New SetTextCallback(AddressOf ShowString)
BeginInvoke(d, inData)
'SerialPort1.DiscardInBuffer() '清除端口缓冲数据
End Sub
Private Sub TB_DQCZ_TextChanged(sender As Object, e As EventArgs) Handles TB_DQCZ.TextChanged
'Dim t As System.IO.StreamWriter = New System.IO.StreamWriter(RtxtPth, True, System.Text.Encoding.UTF8)
'当 当前称重 变化的时候
'计算并显示重量差
TB_ZLC.Text = Format(Str2Num(TB_SYCCZ.Text) - Str2Num(TB_DQCZ.Text), "0.000")
End Sub
Private Sub TB_SYCCZ_TextChanged(sender As Object, e As EventArgs) Handles TB_SYCCZ.TextChanged
'显示重量差
TB_ZLC.Text = Format(Str2Num(TB_SYCCZ.Text) - Str2Num(TB_DQCZ.Text), "0.000")
End Sub