2016-12-06 8 views
-1

DLMS 프로토콜의 전기 계량기, 버스 RS 485 및 RS 485 변환기가 내 컴퓨터에 연결되어 있습니다. DLMS 시리얼과 통신하려고합니다.버스 RS 485 및 프로토콜 DLMS with C#

코드

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

컨트롤을 디버깅 할 수 없으므로이 문제의 해결 방법은 무엇입니까? 어떤 아이디어 –