C# 如何通过串行端口RS-232或usb转换器将称重秤的重量显示到文本框中?

C# 如何通过串行端口RS-232或usb转换器将称重秤的重量显示到文本框中?,c#,usb,serial-port,C#,Usb,Serial Port,我被指派使用C将称重秤CAS CI-201A中的重量显示到文本框中。重量将通过串行端口RS-232或USB转换器发送。天平在我身边,但我不知道从哪里开始。如何实现我的目标?首先,在您开始编写任何代码之前,我会检查您是否使用了正确的电缆。试着打开一个你选择的超级终端,putty并检查是否有任何数据 确保在称重秤和终端程序上配置相同的波特率、停止位和奇偶校验 如果您收到数据,终端程序至少应该显示一些垃圾,那么您可以继续编码。如果没有,请检查您是否使用了正确的电缆 到目前为止,您可以使用C的Seria

我被指派使用C将称重秤CAS CI-201A中的重量显示到文本框中。重量将通过串行端口RS-232或USB转换器发送。天平在我身边,但我不知道从哪里开始。如何实现我的目标?

首先,在您开始编写任何代码之前,我会检查您是否使用了正确的电缆。试着打开一个你选择的超级终端,putty并检查是否有任何数据

确保在称重秤和终端程序上配置相同的波特率、停止位和奇偶校验

如果您收到数据,终端程序至少应该显示一些垃圾,那么您可以继续编码。如果没有,请检查您是否使用了正确的电缆

到目前为止,您可以使用C的SerialPort类
你试过什么了吗

如果要使用串行端口,首先让用户选择要使用的端口是有意义的。这可以通过在组合框中填充所有可用端口轻松完成

        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' });
                    }
                }
            }
          
        }
    }