一批黑码
2018-09-25 04:05
采纳率: 25%
浏览 456
已采纳

VB.NET SerialPort SHIKO天平减重称量用法?

问题1:在实际应用中,连接了SHINKO的电子天平,使用减重称量的方式记录每次减下重量,在减下物品的时候,因为风或触碰,所以需要判断重量稳定了才能记录结果,搞了多次测试了,感觉已经困在自己的逻辑里面了,求高手点醒!

问题2:VB.NET中的SerialPort 使用 ReadExisting 方法读取数据后,缓存区的数据还在吗?我用了 DataReceived 事件来触发 ReadExisting,现在得出的结果不是预期效果。

新人,无分,请高手不吝赐教!有代码最好!万分感谢!在线等。。。。
我用的是 VS2017 目标框架是 .NET Framework 2.0 语言是 VB

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 一批黑码 2018-10-02 15:03
    已采纳

    通过自己想办法已解决,分享下思路吧,让同样遭遇的人少走一些弯路:
    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
    
    打赏 评论
  • devmiao 2018-10-01 16:15

    建议你用visual c++。visual basic并不适合做这个程序的。所以你是做不出来的。

    打赏 评论
  • 一批黑码 2018-10-01 17:02

    补充说明一下最终目的:
    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
    
    
    打赏 评论

相关推荐 更多相似问题