C# を使用して、体重計 (CAS CI-201A) の重量をテキスト ボックスに表示するように割り当てられました。重量は、シリアル ポート RS-232 または USB コンバーター経由で送信されます。スケールは私と一緒ですが、どこから始めればよいかわかりません。どうすれば目標を達成できますか?
8 に答える
もう何か試しましたか?
シリアル ポートを使用する場合は、最初に使用するポートを選択する方法をユーザーに提供するのが理にかなっています。これは、コンボボックスに使用可能なすべてのポートを入力することで簡単に実行できます。
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
}
}
}
}
}
これに基づいて:
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);
まず、コードを書き始める前に、適切なケーブルを使用しているかどうかを確認します。任意のシリアル ターミナル (HyperTerm、putty) を開いて、データが存在するかどうかを確認してください。
体重計と端末プログラムの両方で、必ず同じボーレート、ストップビット、およびパリティを設定してください。
データを受信した場合 (端末プログラムは少なくともゴミを表示する必要があります)、コーディングに進むことができます。そうでない場合は、正しいケーブル (クロスオーバー ヌルモデム) を使用しているかどうかを確認します。
ここまで来たらSerialPort
、C# のクラス
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspxを使用できます。
アダムの提案に基づいて、出力を人間が読める形式に変換しました(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 (計量機のマニュアルを参照) を確認するか、ケーブルを確認する必要があります。