C# 如何通过串行端口RS-232或usb转换器将称重秤的重量显示到文本框中?
我被指派使用C将称重秤CAS CI-201A中的重量显示到文本框中。重量将通过串行端口RS-232或USB转换器发送。天平在我身边,但我不知道从哪里开始。如何实现我的目标?首先,在您开始编写任何代码之前,我会检查您是否使用了正确的电缆。试着打开一个你选择的超级终端,putty并检查是否有任何数据 确保在称重秤和终端程序上配置相同的波特率、停止位和奇偶校验 如果您收到数据,终端程序至少应该显示一些垃圾,那么您可以继续编码。如果没有,请检查您是否使用了正确的电缆 到目前为止,您可以使用C的SerialPort类C# 如何通过串行端口RS-232或usb转换器将称重秤的重量显示到文本框中?,c#,usb,serial-port,C#,Usb,Serial Port,我被指派使用C将称重秤CAS CI-201A中的重量显示到文本框中。重量将通过串行端口RS-232或USB转换器发送。天平在我身边,但我不知道从哪里开始。如何实现我的目标?首先,在您开始编写任何代码之前,我会检查您是否使用了正确的电缆。试着打开一个你选择的超级终端,putty并检查是否有任何数据 确保在称重秤和终端程序上配置相同的波特率、停止位和奇偶校验 如果您收到数据,终端程序至少应该显示一些垃圾,那么您可以继续编码。如果没有,请检查您是否使用了正确的电缆 到目前为止,您可以使用C的Seria
你试过什么了吗 如果要使用串行端口,首先让用户选择要使用的端口是有意义的。这可以通过在组合框中填充所有可用端口轻松完成
private void Form1_Load(object sender, EventArgs e)
{
string[] portNames = SerialPort.GetPortNames();
foreach (var portName in portNames)
{
comboBox1.Items.Add(portName);
}
comboBox1.SelectedIndex = 0;
}
这段代码使用一个带有组合框的表单,称为comboBox1 Default。
您需要添加:
using System.IO.Ports;
到使用指令
然后将按钮1和多行文本框1添加到表单中,并添加以下代码:
private void button1_Click(object sender, EventArgs e)
{
_serialPort = new SerialPort(comboBox1.Text, BaudRate, Parity.None, 8, StopBits.One);
_serialPort.DataReceived += SerialPortOnDataReceived;
_serialPort.Open();
textBox1.Text = "Listening on " + comboBox1.Text + "...";
}
private void SerialPortOnDataReceived(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
{
while(_serialPort.BytesToRead >0)
{
textBox1.Text += string.Format("{0:X2} ", _serialPort.ReadByte());
}
}
这还需要您添加:
private SerialPort _serialPort;
private const int BaudRate = 9600;
右下方的开口支架
public partial class Form1 : Form
单击按钮后,从所选组件接收的所有数据将在文本框中显示为十六进制值
免责声明:上述代码不包含错误处理,如果多次单击button1,则会产生错误,因为SerialPort的前一个实例未正确关闭。使用此示例时请记住这一点
问候尼科
完整代码:
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
{
while (_serialPort.BytesToRead > 0) //<-- repeats until the In-Buffer is empty
{
textBox1.Text += string.Format("{0:X2} ", _serialPort.ReadByte());
//<-- bytewise adds inbuffer to textbox
}
}
}
}
}
基于此:
收听COM1。。。30 30 33 20 49 44 5F 30 3A 20 20 31 30
2E 36 20 6B 67 20 0D 0A 0D 0A
作为此项的ASCII码:
0033内径00:10.6千克
您可以通过修剪接收到的字符串来获得结果。假设侦听器将字节放入数组byte[]serialReceived中:
根据adam的建议,我将输出转换为人类可读的格式,从ASCII转换为UTF8 我将字节放入数组字节[]
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();
}
}
这是完整的工作代码
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();
}
}
}
如果您使用的是A&D EK V校准型号:和EK-610V。您已使用波特率=2400;数据位=7
注意:如果您得到这样的输出
您必须检查波特率、数据位,请参阅称重机手册或检查电缆我使用的是Anto sujesh的代码,但我遇到的问题是,我从磅秤获得的一些值已损坏。我通过缓冲缓存文件中的值来解决这个问题
using System;
using System.IO.Ports;
using System.Windows.Forms;
namespace ComPortTests
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private SerialPort _serialPort = null;
private void Form1_Load(object sender, EventArgs e)
{
_serialPort = new SerialPort("COM1", 9600, Parity.None, 8);
_serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);
_serialPort.Open();
}
void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = _serialPort.ReadExisting();
textBox2.Text = data;
}
}
}
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 = Encoding.UTF8.GetString(data);
//Buffers values in a file
File.AppendAllText("buffer1", str);
//Read from buffer and write into "strnew" String
string strnew = File.ReadLines("buffer1").Last();
//Shows actual true value coming from scale
textBox5.Text = strnew;
我正在使用
耀华xk3190-a9
称重指示器连接到我的串行端口。在尝试了很多代码之后,遵循代码终于对我起了作用。我在这里粘贴代码,以便任何人使用相同的设备都可以获得帮助
private SerialPort _serialPort;
private const int BaudRate = 2400;
private void Form1_Load(object sender, EventArgs e)
{
string[] portNames = SerialPort.GetPortNames();
foreach (var portName in portNames)
{
comboBox1.Items.Add(portName);
}
comboBox1.SelectedIndex = 0;
//<-- 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, 7, 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
}
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
{
string data = _serialPort.ReadExisting();
if (data != null)
{
if (data.ToString() != "")
{
if (data.Length > 6)
{
var result = data.Substring(data.Length - 5);
textBox1.Text = result.ToString().TrimStart(new Char[] { '0' });
}
}
}
}
}
是什么引起了你的问题?RS232部分还是文本框部分?你试过什么?我不知道从哪里开始:我会先添加一个对DDL的引用,让你可以访问scale的API。。。第73页之后的内容看起来也很相关。试着把问题分解成小块。能否显示文本框并在其中显示值?一旦你能做到这一点,想一想如何从天平上获得价值;首先必须连接到刻度,然后必须读取数值。哪里可以找到DDL?抱歉,如果我的问题看起来很傻,因为我是一个完全的初学者。我已经试过你的代码。但是,单击按钮一次后,textBox1中没有显示任何内容。如果多次单击未经处理的exc,对端口COM1的访问将被拒绝。这可能意味着端口上没有传入通信,或者您的端口错误。在担心编写软件之前,请确保电子秤确实发送了一些信息。Khôi给出了一些关于如何做到这一点的建议。此外,还更改了使用调用的事件处理程序,使其在UI线程中运行。这是必要的,因为事件和UI更新不在同一线程中发生。另外,我测试了代码。按预期工作。所以很可能你没有收到任何来电。嗨。。在玩了电子秤之后,我在按下上面的打印按钮后,设法得到了这个输出[在COM1上收听30 33 33 20 49 44 5F 30 3A 20 20 20 31 30 2E 36 20 6B 67 20 0D 0A 0D 0A]。。输出意味着什么以及下一步要做什么?嗯,这些十六进制值是以下字符串的ASCII:0033 ID_00:10.6 kg这是您的体重。感谢各位,特别是Nicolas和Adam Casey。。问题解决了=您可能希望对有帮助的答案进行投票,并接受此问题未来读者的答案。如果您的预数据小于13位,该怎么办?u和u正在使用多个具有不同行前数据大小的定标器?@Ra punzo您可以将13更改为您的字节长度,比如textBox1.Text=reading.Substringreading.length—您的长度;
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 = Encoding.UTF8.GetString(data);
//Buffers values in a file
File.AppendAllText("buffer1", str);
//Read from buffer and write into "strnew" String
string strnew = File.ReadLines("buffer1").Last();
//Shows actual true value coming from scale
textBox5.Text = strnew;
private SerialPort _serialPort;
private const int BaudRate = 2400;
private void Form1_Load(object sender, EventArgs e)
{
string[] portNames = SerialPort.GetPortNames();
foreach (var portName in portNames)
{
comboBox1.Items.Add(portName);
}
comboBox1.SelectedIndex = 0;
//<-- 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, 7, 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
}
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
{
string data = _serialPort.ReadExisting();
if (data != null)
{
if (data.ToString() != "")
{
if (data.Length > 6)
{
var result = data.Substring(data.Length - 5);
textBox1.Text = result.ToString().TrimStart(new Char[] { '0' });
}
}
}
}
}