在C#中读取Modbus串行端口数据 [英] Modbus Serial Port Data Reading in C#

查看:280
本文介绍了在C#中读取Modbus串行端口数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我正在尝试读取串行端口数据。我使用NModbus库进行modbus通信。代码适用于读写目的。但有时我有一些未知的错误,我想看看串行端口的活动。我尝试使用 SerialDataReceivedEventHandler ,但我没有从端口获取任何东西,但仍然可以读取保持寄存器的值。这是我的代码。我希望通过串口发送/接收数据包。

  namespace ModbusMaster 
{
public partial class Form1:Form
{

public Form1()
{
InitializeComponent();
this.Load + = Form1_Load;



$ b void Form1_Load(object sender,EventArgs e)
{
int [] baud = new int [] {4800 ,9600,19200,38400,57600,115200};
int [] databit = new int [] {7,8};
int [] stpBits = new int [] {1,2};
string [] party = new string [] {None,Odd,Even};
string [] Mode =新字符串[] {ASCII,RTU};
ModbusMode.DataSource =模式;
Baud_Rate.DataSource =波特;
Data.DataSource = databit;
Stop.DataSource = stpBits;
Pari.DataSource =派对;
GetPortList();


private void button1_Click(object sender,EventArgs e)
{
string ProtocolMode = ModbusMode.GetItemText(ModbusMode.SelectedItem);
string portName = listBox1.GetItemText(listBox1.SelectedItem);
if(listBox1.SelectedIndex == -1)
{
MessageBox.Show(请选择串口!!!);
}
else
{

using(SerialPort port = new SerialPort(portName))
{
if(port!= null& amp; ;& port.IsOpen)
{
port.Close();
}
//配置串口
port.BaudRate = int.Parse(Baud_Rate.Text);
port.DataBits = int.Parse(Data.Text);
port.Parity =(Parity)Enum.Parse(typeof(Parity),Pari.Text);
port.StopBits =(StopBits)Enum.Parse(typeof(StopBits),Stop.Text);

port.DataReceived + = new SerialDataReceivedEventHandler(port_DataReceived);
port.Open();

//创建modbus master

if(ProtocolMode ==RTU)
{
IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
int temp = ushort.Parse(StrtAdd.Text) - 1;
字节slaveId = byte.Parse(Slave.Text);
ushort startAddress =(ushort)(temp);
ushort points = ushort.Parse(regis.Text);
ushort [] holding_register = new ushort [] {};

holding_register = master.ReadHoldingRegisters(slaveId,startAddress,points);
string tempString =;
foreach(hold_register中的ushort值)
{
tempString + = value +;
}

val.Text = tempString;
// val.Text = Convert.ToString(hold_register [0] ++ holding_register [1]);

if(ProtocolMode ==ASCII)
{
IModbusSerialMaster master = ModbusSerialMaster.CreateAscii(port);
int temp = ushort.Parse(StrtAdd.Text) - 1;
字节slaveId = byte.Parse(Slave.Text);
ushort startAddress =(ushort)(temp);
ushort points = ushort.Parse(regis.Text);
ushort [] holding_register = new ushort [] {};

holding_register = master.ReadHoldingRegisters(slaveId,startAddress,points);
string tempString =;
foreach(hold_register中的ushort值)
{
tempString + = value +;






$ b private void port_DataReceived(object sender,SerialDataReceivedEventArgs e )
{
//显示端口缓冲区中的所有输入数据
SerialPort sp =(SerialPort)sender;
string indata = sp.ReadExisting();
RcdPacket.Text = indata;

$ b private void GetPortList()
{

listBox1.Items.Clear();
foreach(System.IO.Ports.SerialPort.GetPortNames()中的字符串项)
{
//将每个检索到的可用prot名称存储到Listbox中...
listBox1 .Items.Add(项目);




$ b private void WriteData_Click(object sender,EventArgs e)
{
string ProtocolMode = ModbusMode。 GetItemText(ModbusMode.SelectedItem);
string portName1 = listBox1.GetItemText(listBox1.SelectedItem);
if(listBox1.SelectedIndex == -1)
{
MessageBox.Show(请选择串口!!!);
}

else
{
using(SerialPort port1 = new SerialPort(portName1))
{
if(port1!= null& amp; amp; ;& port1.IsOpen)
{
port1.Close();
}
port1.BaudRate = int.Parse(Baud_Rate.Text);
port1.DataBits = int.Parse(Data.Text);
port1.Parity =(Parity)Enum.Parse(typeof(Parity),Pari.Text);
port1.StopBits =(StopBits)Enum.Parse(typeof(StopBits),Stop.Text);



$ b if(ProtocolMode ==RTU)
{
port1.Open();
IModbusSerialMaster master1 = ModbusSerialMaster.CreateRtu(port1);
int temp = ushort.Parse(WriteAdd.Text) - 1;

字节slaveId = byte.Parse(SlvIdd.Text);
ushort startAdd =(ushort)(temp);
ushort WrValue = ushort.Parse(WriteVal.Text);

master1.WriteSingleRegister(slaveId,startAdd,WrValue);

if(ProtocolMode ==ASCII)
{
port1.Open();
IModbusSerialMaster master1 = ModbusSerialMaster.CreateAscii(port1);
int temp = ushort.Parse(WriteAdd.Text) - 1;

字节slaveId = byte.Parse(SlvIdd.Text);
ushort startAdd =(ushort)(temp);
ushort WrValue = ushort.Parse(WriteVal.Text);

master1.WriteSingleRegister(slaveId,startAdd,WrValue);
}


}

}
}
}
}
://technet.microsoft.com/en-us/sysinternals/bb896644.aspxrel =nofollow> Portmon 来自Sysinternals。这也保证你所看到的实际上是港口上收到的货物

Hi I am trying to read the Serial Port Data. I used NModbus library for the modbus communication. Code works fine for read and write purpose. But sometimes i am having some unknown errors and i wanted to see the serial port activity. I tried using the SerialDataReceivedEventHandler but i am not getting anything from the port but still i am able to read the value of the holding registers. Here is my code. All i want to see the data packet being sent / received over the serial port.

namespace ModbusMaster
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
            this.Load += Form1_Load;


        }

        void Form1_Load(object sender, EventArgs e)
        {
            int[] baud = new int[] {4800,9600,19200,38400,57600,115200};
            int[] databit = new int[] { 7, 8 };
            int[] stpBits = new int[] { 1, 2 };
            string[] party = new string[] { "None", "Odd", "Even" };
            string[] Mode = new string[] { "ASCII", "RTU" };
            ModbusMode.DataSource = Mode;
            Baud_Rate.DataSource = baud;
            Data.DataSource = databit;
            Stop.DataSource = stpBits;
            Pari.DataSource = party;
            GetPortList();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string ProtocolMode = ModbusMode.GetItemText(ModbusMode.SelectedItem);
            string portName = listBox1.GetItemText(listBox1.SelectedItem);
            if (listBox1.SelectedIndex == -1)
            {
                MessageBox.Show("Please select Serial Port!!!");
            }
            else
            {

                using ( SerialPort port = new SerialPort(portName))
                {
                    if (port != null && port.IsOpen)
                    {
                        port.Close();
                    }
                    // configure serial port
                    port.BaudRate = int.Parse(Baud_Rate.Text);
                    port.DataBits = int.Parse(Data.Text);
                    port.Parity = (Parity)Enum.Parse(typeof(Parity), Pari.Text);
                    port.StopBits = (StopBits)Enum.Parse(typeof(StopBits), Stop.Text);

                    port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
                    port.Open();

                    // create modbus master

                    if (ProtocolMode == "RTU")
                    {
                        IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);
                        int temp = ushort.Parse(StrtAdd.Text)- 1;
                        byte slaveId = byte.Parse(Slave.Text);
                        ushort startAddress = (ushort)(temp);
                        ushort points = ushort.Parse(regis.Text);
                        ushort[] holding_register = new ushort[] { };

                        holding_register = master.ReadHoldingRegisters(slaveId, startAddress, points);
                        string tempString = " ";
                        foreach (ushort value in holding_register)
                        {
                            tempString += value + " ";
                        }

                        val.Text = tempString;
                       // val.Text = Convert.ToString(holding_register[0] + " " + holding_register[1]);
                    }
                    if (ProtocolMode == "ASCII")
                    {
                        IModbusSerialMaster master = ModbusSerialMaster.CreateAscii(port);
                        int temp = ushort.Parse(StrtAdd.Text)- 1;
                        byte slaveId = byte.Parse(Slave.Text);
                        ushort startAddress = (ushort)(temp);
                        ushort points = ushort.Parse(regis.Text);
                        ushort[] holding_register = new ushort[] { };

                        holding_register = master.ReadHoldingRegisters(slaveId, startAddress, points);
                        string tempString = " ";
                        foreach (ushort value in holding_register)
                        {
                            tempString += value + " ";
                        }
                    }

                }

            }

        }
        private void port_DataReceived(object sender,    SerialDataReceivedEventArgs e)
        {
            // Show all the incoming data in the port's buffer
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            RcdPacket.Text = indata;

        }
        private void GetPortList()
        {

            listBox1.Items.Clear();
            foreach (string item in System.IO.Ports.SerialPort.GetPortNames())
            {
                //store the each retrieved available prot names into the Listbox...
                listBox1.Items.Add(item);
            }


        }

        private void WriteData_Click(object sender, EventArgs e)
        {
            string ProtocolMode = ModbusMode.GetItemText(ModbusMode.SelectedItem);
            string portName1 = listBox1.GetItemText(listBox1.SelectedItem);
            if (listBox1.SelectedIndex == -1)
            {
                MessageBox.Show("Please select Serial Port!!!");
            }

            else
            {
                using (SerialPort port1 = new SerialPort(portName1))
                {
                    if (port1 != null && port1.IsOpen)
                    {
                        port1.Close();
                    }
                    port1.BaudRate = int.Parse(Baud_Rate.Text);
                    port1.DataBits = int.Parse(Data.Text);
                    port1.Parity = (Parity)Enum.Parse(typeof(Parity), Pari.Text);
                    port1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), Stop.Text);




                    if (ProtocolMode == "RTU")
                    {
                        port1.Open();
                        IModbusSerialMaster master1 = ModbusSerialMaster.CreateRtu(port1);
                        int temp = ushort.Parse(WriteAdd.Text) - 1;

                        byte slaveId = byte.Parse(SlvIdd.Text);
                        ushort startAdd = (ushort)(temp);
                        ushort WrValue = ushort.Parse(WriteVal.Text);

                        master1.WriteSingleRegister(slaveId, startAdd, WrValue);
                    }
                    if (ProtocolMode == "ASCII")
                    {
                        port1.Open();
                        IModbusSerialMaster master1 = ModbusSerialMaster.CreateAscii(port1);
                        int temp = ushort.Parse(WriteAdd.Text) - 1;

                        byte slaveId = byte.Parse(SlvIdd.Text);
                        ushort startAdd = (ushort)(temp);
                        ushort WrValue = ushort.Parse(WriteVal.Text);

                        master1.WriteSingleRegister(slaveId, startAdd, WrValue);
                    }


                }

            }
        }
   }
}

解决方案

If you just want to see the traffic that flows i recommend using Portmon from Sysinternals. This also guaranties that what you see is actually what was received on the port

这篇关于在C#中读取Modbus串行端口数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆