为什么我从C#的串行端口中获得部分奇怪的值 [英] Why do I get partly strange values from serial port in C#
问题描述
我正在开发一个程序,该程序可以处理秤的数据.秤通过USB串行端口连接.我正在使用此问题中的代码:
I am working on a program that process data from a scale. The Scale is connected via USB serial Port. I am using the code from this Question: How to display weight from weighing scale into a textbox via serial port RS-232 or usb converter?. So the most important part is working. I get the weight from the scale as a string.
我的问题是,当秤将重量值(10/s)发送到计算机时,例如,我得到以下值:
My problem is, when the scale is sending the weight values (10/s) to the computer I am getting the following values for example:
13,0克;13,0克;12,9克;,8克;12,7克;2,6克;12,5克;12,4克;,3g;2,2克;12,1克;
13,0g; 13,0g; 12,9g; ,8g; 12,7g; 2,6g; 12,5g; 12,4g; ,3g; 2,2g; 12,1g;
您可以看到,某些值已损坏,有时第一个字符丢失,或者有时前两个字符...当我尝试使用秤制造商的其他程序读取值时,它的工作正常,所有值都是正确的.
You can see, some of the values are corrupted, sometimes the first character is missing, or sometimes the first 2 characters... When I try to read the values by using an other program from the scale manufacturer, its working fine, all values are correct.
那是什么问题?
我尝试了不同的波特率和其他设置,没有任何帮助.希望有人能帮助我.
I tried different baud rates and other settings, nothing helped. Hope someone can help me.
这是我用来从链接页面的串行端口读取数据的代码.
Here is the Code I use to read the data from serial port from the linked page.
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();
}
}
}
推荐答案
我只需要添加以下几行,即可将值缓存在缓存文件中.
I just had to add the following lines to buffer the values in a cache file.
现在可以正常工作了!谢谢
Now it works fine! Thanks at all
File.AppendAllText("buffer1.txt", str);
string strnew = File.ReadLines("buffer1.txt").Last();
textBox5.Text = strnew;
这篇关于为什么我从C#的串行端口中获得部分奇怪的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!