与C#中的总线RS 485和协议DLMS进行串行通信

时间:2016-12-06 10:44:53

标签: c# serial-port rs485

我有一台带有DLMS协议的电表,总线RS 485和RS 485转换器连接在我的电脑上。我正在尝试与DLMS串行通信。

代码

var app = angular.module("app", ["checklist-model"]);
app.controller('Ctrl4a', function($scope) {
    $scope.roles = [];
});

我的问题是:

我运行此代码但没有显示任何内容。

预期输出为:

我需要任何回复。我尝试了不同的方式,阅读了很多文章,但问题没有解决。我可以使用软件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();
            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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分: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);
}