如何从秤到通过串行口RS-232或USB转换器一个文本框显示的重量? [英] How to display weight from weighing scale into a textbox via serial port RS-232 or usb converter?

查看:169
本文介绍了如何从秤到通过串行口RS-232或USB转换器一个文本框显示的重量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我被分配到从称重秤(CAS CI-201A)到使用C#文本框显示的重量。重量将通过串行端口的RS-232或USB转换器发送。规模是我,但我不知道从哪里开始。我怎样才能实现我的目标?

I've been assigned to display weight from weighing scale (CAS CI-201A) into a textbox using C#. The weight will be sent via serial port RS-232 or USB converter. The scale is with me but I don't know where to start. How can I achieve my goal?

推荐答案

您是否尝试过什么了吗?

Have you tried anything yet?

如果你想使用它是有意义的串口,首先给用户的方式来选择要使用的端口。这很容易做到,通过填补所有可用端口的组合框。

If you want to use the serial port it makes sense to first give the user a way to select which port to use. This can be done easily, by filling a combobox with all available ports.

        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(默认)。
你将需要添加:

This code uses a form with a comboBox on it, called "comboBox1" (Default). You will need to add:

using System.IO.Ports;



到使用的指令。

to the using directives.

然后添加一个按钮(按钮1)和一个多行文本框(TextBox1中)的形式和添加以下代码:

Then add a button (button1) and a multiline textbox (textbox1) to the form and add this code:

        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;



下方的

right below the opening brackets of

public partial class Form1 : Form

单击该按钮后,所有。收到选定相称的数据将显示为文本框十六进制值

After clicking the button, all received data from the selected comPort will be displayed as hex values in the TextBox.

免责声明:上面的代码不包含错误处理,如果Button1的点击多会产生错误次,由于这样的事实:的SerialPort的前面的实例未正确关闭。 。使用这个例子时,请记住这一点。

DISCLAIMER: The above code contains NO error-handling and will produce errors if button1 is clicked multiple times, due to the fact that the previous instance of "SerialPort" is not closed properly. Please remember this when using this example.

问候尼科

完整代码:

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
                }
            }
        }
    }
}

这篇关于如何从秤到通过串行口RS-232或USB转换器一个文本框显示的重量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆