-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();

BytesToReadとなります0。したがって、 read を表示するために 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);
}
于 2016-12-06T10:54:06.953 に答える