为什么我在C#中从串口获得部分奇怪的值

我正在开发一个处理规模数据的程序。 秤通过USB串口连接。 我正在使用此问题中的代码: 如何通过串口RS-232或USB转换器将称重秤的重量显示到文本框中? 。 所以最重要的部分是工作。 我从秤上得到了重量作为一个字符串。

我的问题是,当秤将重量值(10 / s)发送到计算机时,我得到以下值,例如:

13,0g; 13,0g; 12,9g; ,8G; 12,7g; 2,6g; 12,5g; 12,4g; ,3G; 2,2g; 12,1g;

您可以看到,某些值已损坏,有时第一个字符丢失,或者有时前两个字符…当我尝试使用来自秤制造商的其他程序读取值时,其工作正常,所有值是正确的。

那么问题是什么?

我尝试了不同的波特率和其他设置,没有任何帮助。 希望可以有人帮帮我。

这是我用来从链接页面读取串口数据的代码。

using System; using System.IO.Ports; //<-- necessary to use "SerialPort" using System.Windows.Forms; namespace ComPortTests { public partial class Form1 : Form { private SerialPort _serialPort; //<-- declares a SerialPort Variable to be used throughout the form private const int BaudRate = 9600; //<-- BaudRate Constant. 9600 seems to be the scale-units default value public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string[] portNames = SerialPort.GetPortNames(); //<-- Reads all available comPorts foreach (var portName in portNames) { comboBox1.Items.Add(portName); //<-- Adds Ports to combobox } comboBox1.SelectedIndex = 0; //<-- Selects first entry (convenience purposes) } private void button1_Click(object sender, EventArgs e) { //<-- This block ensures that no exceptions happen if(_serialPort != null && _serialPort.IsOpen) _serialPort.Close(); if (_serialPort != null) _serialPort.Dispose(); //<-- End of Block _serialPort = new SerialPort(comboBox1.Text, BaudRate, Parity.None, 8, StopBits.One); //<-- Creates new SerialPort using the name selected in the combobox _serialPort.DataReceived += SerialPortOnDataReceived; //<-- this event happens everytime when new data is received by the ComPort _serialPort.Open(); //<-- make the comport listen textBox1.Text = "Listening on " + _serialPort.PortName + "...\r\n"; } private delegate void Closure(); private void SerialPortOnDataReceived(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs) { if (InvokeRequired) // { SerialPortOnDataReceived(sender, serialDataReceivedEventArgs); })); //<-- Function invokes itself else { int dataLength = _serialPort.BytesToRead; byte[] data = new byte[dataLength]; int nbrDataRead = _serialPort.Read(data, 0, dataLength); if (nbrDataRead == 0) return; string str = System.Text.Encoding.UTF8.GetString(data); textBox1.Text = str.ToString(); } } } 

我只需要添加以下行来缓冲缓存文件中的值。

现在它工作正常! 谢谢你

  File.AppendAllText("buffer1.txt", str); string strnew = File.ReadLines("buffer1.txt").Last(); textBox5.Text = strnew;