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

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

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

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

3个回答

通过自己想办法已解决,分享下思路吧,让同样遭遇的人少走一些弯路:
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并不适合做这个程序的。所以你是做不出来的。

qq_43256140
一批黑码 为什么c++适合,VB不适合呢?我是小白,请指点!谢谢!
接近 2 年之前 回复

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐