DLMSプロトコルの電気メーター、バスRS 485とRS 485コンバータがコンピュータに接続されています。私はDLMSシリアルと通信しようとしています。バスRS 485とのシリアル通信とC#のプロトコルDLMS
コード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
namespace DLMSRS485Console
{
class Program
{
static void Main(string[] args)
{
SerialPort myPort = new SerialPort();
myPort.PortName = "COM5";
myPort.BaudRate = 300;
myPort.Parity = Parity.None;
myPort.StopBits = StopBits.One;
myPort.DataBits = 8;
myPort.Handshake = Handshake.None;
myPort.RtsEnable = true;
myPort.Open();
myPort.WriteLine("/?!\r\n");
myPort.DataReceived += new SerialDataReceivedEventHandler(myPort_DataReceived);
Console.ReadKey();
myPort.Close();
}
private static void myPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string data = sp.ReadExisting();
Console.Write("Bytes to read : ");
Console.WriteLine(sp.BytesToRead);
while (sp.BytesToRead > 0)
{
Console.WriteLine(data);
}
}
}
}
私の問題は、次のとおりです。
私はこのコードを実行すると、それは何も表示されません。
予想される出力は次のようになります。私は何の応答も必要
。私はさまざまな方法でそれを試しましたが、多くの記事を読んでいますが、問題は解決していません。 ComTestSerialソフトウェアを使用して、応答するかどうかを確認できます。はい、それは私のコードを介して任意の返信を返信したい今応答する。
事前のおかげで、どんな応答も本当に感謝しています。
アップデート1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
namespace DLMSRS485Console
{
class Program
{
static void Main(string[] args)
{
SerialPort myPort = new SerialPort("COM5");
//myPort.PortName = "COM5";
myPort.BaudRate = 9600;
myPort.Parity = Parity.None;
myPort.StopBits = StopBits.One;
myPort.DataBits = 8;
myPort.Handshake = Handshake.None;
myPort.RtsEnable = true;
myPort.Open();
myPort.DataReceived += new SerialDataReceivedEventHandler(myPort_DataReceived);
myPort.WriteLine("Hello\n");
Console.Write("Bytes to read : ");
int b = myPort.BytesToRead;
Console.WriteLine(b);
//myPort.WriteLine("rtfm ^^");
Console.ReadKey();
myPort.Close();
}
private static void myPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string data = sp.ReadExisting();
Console.Write("Bytes to read : ");
Console.WriteLine(sp.BytesToRead);
Console.WriteLine(data);
}
}
}
返信として何を送信しますか? –
の 'ReadExisting()' 'sp.BytesToRead'は' 0'になります。したがって、whileループは入力されません。 whileループを削除してください。あなたがそこに入るべきであれば、これは永遠の罠です。 –
何かを送る前にイベントに登録してください(通信は遅いですが、それでもなお)。 「何らかの応答」とは何ですか? 'DataReceived'イベントの最初の行にブレークポイントを設定します。何もない? comポートを正しく設定し、正しいバイト/テキスト(rtfm ^^)を送信していることを確認してください。 '/?!\ r \ n" 'あなたが期待しているものではないかもしれません(' \ n' **は既に '\ xd \ xa'です)。シリアルスニッファを使用して、トラフィックを傍受してログに記録することができます( 'ComTestSerial'の場合もありますが、いくつかの重要な詳細があるかもしれません)。あなたはタイムアウトなどを設定していません。 – Sinatr