2016-12-06 27 views
-1

У меня есть электрический счетчик с протоколом DLMS, преобразователь шины RS 485 и RS 485, подключенный к компьютеру. Я пытаюсь установить связь с последовательностью DLMS.Последовательная связь с шиной RS 485 и протоколом DLMS в 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 для проверки ответа или нет. Да, теперь я отвечаю, что хочу, чтобы он отправил ответ через мой код.

Успешное спасибо и любой ответ действительно оценят.

Update 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' ** is ** уже' \ xd \ xa'). Вы можете использовать последовательные снифферы для перехвата и логарифмического трафика (сделайте это для 'ComTestSerial', возможно, есть некоторые важные детали). Вы не устанавливаете таймауты и т. Д. – Sinatr

ответ

1

Проблема
я запускаю этот код и он ничего не показывает.

После этой линии:

string data = sp.ReadExisting(); 

BytesToRead будет 0. Таким образом, вы никогда не войдете в цикл 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

Я могу отлаживать управление, никогда не обращаясь к обработчику событий, тогда какое решение этой проблемы? Любая идея –