2016-12-06 2 views
-1

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); 
     } 
    } 
} 
+0

返信として何を送信しますか? –

+0

の 'ReadExisting()' 'sp.BytesToRead'は' 0'になります。したがって、whileループは入力されません。 whileループを削除してください。あなたがそこに入るべきであれば、これは永遠の罠です。 –

+0

何かを送る前にイベントに登録してください(通信は遅いですが、それでもなお)。 「何らかの応答」とは何ですか? 'DataReceived'イベントの最初の行にブレークポイントを設定します。何もない? comポートを正しく設定し、正しいバイト/テキスト(rtfm ^^)を送信していることを確認してください。 '/?!\ r \ n" 'あなたが期待しているものではないかもしれません(' \ n' **は既に '\ xd \ xa'です)。シリアルスニッファを使用して、トラフィックを傍受してログに記録することができます( 'ComTestSerial'の場合もありますが、いくつかの重要な詳細があるかもしれません)。あなたはタイムアウトなどを設定していません。 – Sinatr

答えて

1

問題
私はこのコードを実行すると、それは何も表示されません。この行の後

string data = sp.ReadExisting(); 

BytesToRead0になります。したがって、あなたはwhileループを入力せずに、dataと表示されることはありません。 whileループを削除してデータを表示してください:

private static void myPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 

    Console.Write("Bytes to read : "); 
    Console.WriteLine(sp.BytesToRead); 

    string data = sp.ReadExisting(); 
    Console.WriteLine(data); 
} 
+0

whileループは削除できますが、データは削除できません。なぜDataReceivedハンドラはトリガではないのですか? –

+0

には多くの理由があります。デバイスが送信しない、またはCOMポートの設定が間違っている可能性がありますか? –

+0

私はコントロールをデバッグすることはできません、イベントハンドラに行く、この問題の解決は何ですか?任意のアイデア –

関連する問題