HT1131502524 2019-10-28 22:10 采纳率: 0%
浏览 553

C#通过SerialPort读取电子天平数据时第一次操作无法获取数据,必须进行第二次操作才能获取当前数据?

C#通过SerialPort读取电子天平数据时,连接串口成功后,通过发送命令方式第一次操作无法获取数据,无任何数据返回,必须进行第二次操作才能获取当前数据。并且更新电子天平负载后,单击读取数据按钮,通过串口获得的数据为上一次读数,必须再单击一次才能获取更新的数据。一直卡到这里,不知道怎么解决,求大神帮忙看看!暂无积分,抱歉!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Text.RegularExpressions;

namespace 读天平
{
public partial class Form1 : Form
{
SerialPort mySerialPort = null;
string receiveing;
string read_data;
int count_read;
int row_no;
int column_no;
DataGridView dgv;
public Form1()
{
InitializeComponent();
}

    private void Form1_Load(object sender, EventArgs e)
    {
        mySerialPort = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One);
        mySerialPort.Handshake = Handshake.None; // 四种都可以使用
        mySerialPort.Open();
        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_DataReceivedHandler);
        mySerialPort.DtrEnable = true; // 加上此属性接收事件可被触发
        mySerialPort.ReceivedBytesThreshold = 1;
        if (mySerialPort.IsOpen == true)
        {
            MessageBox.Show("串口打开成功", "提示", MessageBoxButtons.OK);
        }
        else
        {
            MessageBox.Show("串口打开失败", "提示", MessageBoxButtons.OK);
        }
    }

    private void mySerialPort_DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)  // SerialPort.DataReceived事件运行比较特殊,其运行在辅线程,不能与主线程中的显示数据控件直接进行数据传输,必须用间接的方式实现
    {//接收数据
        SerialPort sp = (SerialPort)sender;
        read_data = sp.ReadExisting();
        this.Invoke((EventHandler)(delegate { receiveing = read_data.Trim().TrimStart('+').TrimStart('-').TrimEnd('g').Trim(); }));
        mySerialPort.DiscardInBuffer(); // 清除接收缓存
    }

    private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        byte[] send = { 0x1B, 0x70 };    // 十六进制ASCII码
        mySerialPort.Write(send, 0, send.Length);
        row_no = e.RowIndex;
        column_no = e.ColumnIndex;
        dgv = dataGridView1;
        dgv.Rows[row_no].Cells[column_no].Value = receiveing;
    }

    private void dataGridView2_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        byte[] send = { 0x1B, 0x70 };    // 十六进制ASCII码
        mySerialPort.Write(send, 0, send.Length);
        row_no = e.RowIndex;
        column_no = e.ColumnIndex;
        dgv = dataGridView2;
        dgv.Rows[row_no].Cells[column_no].Value = receiveing;
    }



}

}

  • 写回答

2条回答 默认 最新

  • G_D_Q 2020-07-10 09:12
    关注

    在接收数据的地方设置一个延时,等待数据接收完整。
    System.Threading.Thread.Sleep(100);//延时100ms等待接收完数据
    具体延时时间可以按照波特率和实际数据长度计算。

    评论

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站