6

C# を使用して、体重計 (CAS CI-201A) の重量をテキスト ボックスに表示するように割り当てられました。重量は、シリアル ポート RS-232 または USB コンバーター経​​由で送信されます。スケールは私と一緒ですが、どこから始めればよいかわかりません。どうすれば目標を達成できますか?

4

8 に答える 8

11

もう何か試しましたか?

シリアル ポートを使用する場合は、最初に使用するポートを選択する方法をユーザーに提供するのが理にかなっています。これは、コンボボックスに使用可能なすべてのポートを入力することで簡単に実行できます。

        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" (デフォルト) と呼ばれる、comboBox を含むフォームを使用します。以下を追加する必要があります。

using System.IO.Ports;

using ディレクティブに。

次に、ボタン (button1) と複数行のテキスト ボックス (textbox1) をフォームに追加し、次のコードを追加します。

        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

ボタンをクリックすると、選択した comPort から受信したすべてのデータが TextBox に 16 進値として表示されます。

免責事項: 上記のコードにはエラー処理が含まれておらず、「SerialPort」の前のインスタンスが適切に閉じられていないため、button1 が複数回クリックされるとエラーが発生します。この例を使用するときは、このことを覚えておいてください。

よろしくニコ

完全なコード:

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
                }
            }
        }
    }
}
于 2012-05-16T08:27:18.063 に答える
7

これに基づいて:

COM1 でリッスン中... 30 30 33 33 20 49 44 5F 30 30 3A 20 20 20 31 30 2E 36 20 6B 67 20 0D 0A 0D 0A

これのASCIIであること:

0033 ID_00: 10.6kg

受信した文字列をトリミングすることで結果を取得できます。リスナーがバイトを配列に入れると仮定しますbyte[] serialReceived

string reading = System.Text.Encoding.UTF8.GetString(serialReceived);
textBox1.Text = reading.Substring(13);
于 2012-05-18T16:52:59.913 に答える
5

まず、コードを書き始める前に、適切なケーブルを使用しているかどうかを確認します。任意のシリアル ターミナル (HyperTerm、putty) を開いて、データが存在するかどうかを確認してください。

体重計と端末プログラムの両方で、必ず同じボーレート、ストップビット、およびパリティを設定してください。

データを受信した場合 (端末プログラムは少なくともゴミを表示する必要があります)、コーディングに進むことができます。そうでない場合は、正しいケーブル (クロスオーバー ヌルモデム) を使用しているかどうかを確認します。

ここまで来たらSerialPort、C# のクラス http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspxを使用できます。

于 2012-05-16T08:11:38.287 に答える
2

アダムの提案に基づいて、出力を人間が読める形式に変換しました(ASCIIからUTF8に)、バイトを配列byte []に​​入れます

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。BaudRate = 2400 を使用しています。およびデータビット = 7

注:このような出力が得られた場合 ここに画像の説明を入力

BaudRate、DataBits (計量機のマニュアルを参照) を確認するか、ケーブルを確認する必要があります。

于 2016-10-30T11:52:32.280 に答える