-1

我有一个带有 DLMS 协议、总线 RS 485 和 RS 485 转换器的电表与我的计算机相连。我正在尝试与 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);
        }
    }
}
4

1 回答 1

1

问题
我运行这段代码,它什么也没显示。

在这一行之后:

string data = sp.ReadExisting();

BytesToRead0。所以你永远不会进入你的 while 循环来显示 read 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);
}
于 2016-12-06T10:54:06.953 回答