У меня есть электрический счетчик с протоколом 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);
}
}
}
Что вы хотите отправить как ответ? –
после 'ReadExisting()' 'sp.BytesToRead' будет' 0'. Таким образом, ваш цикл while не будет введен. Удалите цикл while. Это ловушка навсегда, если вы когда-нибудь заходите туда. –
Подпишитесь на мероприятие перед отправкой чего-то (общение идет медленно, но все же). Что такое «любой ответ»? Установите точку останова в первой строке события 'DataReceived'. Ничего? Убедитесь, что вы правильно настроили com-порт и отправили правильные байты/текст (rtfm ^^). Что вы пытаетесь отправить сейчас: '' /?! \ R \ n "' может быть не тем, что вы ожидаете ('\ n' ** is ** уже' \ xd \ xa'). Вы можете использовать последовательные снифферы для перехвата и логарифмического трафика (сделайте это для 'ComTestSerial', возможно, есть некоторые важные детали). Вы не устанавливаете таймауты и т. Д. – Sinatr