我正在开发一个处理秤数据的程序。秤通过 USB 串行端口连接。
我正在使用这个问题中的代码:如何通过串口RS-232或USB转换器将体重秤的重量显示到文本框中? https://stackoverflow.com/questions/10614286/how-to-display-weight-from-weighing-scale-into-a-textbox-via-serial-port-rs-232。
所以最重要的部分是工作。我从秤上得到了一根绳子的重量。
我的问题是,当秤将重量值(10/s)发送到计算机时,我得到以下值,例如:
13.0克; 13.0克; 12.9克; ,8克; 12.7克; 2.6克; 12.5克; 12.4克; ,3克; 2.2克; 12.1克;
您可以看到,某些值已损坏,有时第一个字符丢失,有时前 2 个字符......
当我尝试使用秤制造商的其他程序读取这些值时,它工作正常,所有值都是正确的。
那么问题出在哪里呢?
我尝试了不同的波特率和其他设置,但没有任何帮助。
希望可以有人帮帮我。
这是我用来从链接页面读取串行端口数据的代码。
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) //<-- Makes sure the function is invoked to work properly in the UI-Thread
BeginInvoke(new Closure(() => { 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();
}
}
}