SerialPort sp = new SerialPort(...);
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e){...}
2)CRC校验
CRC校验用于modbus通信的消息准确性验证,介绍及算法实现见另一篇博文《CRC循环冗余校验算法两种实现方式(逐位计算法和查表法)c sharp 版》。
使用2个字节的校验码长度,高字节和低字节排列顺序需注意,通信双方约定好即可,常见的排列是低字节在前,高字节在后。
3)构造Modbus帧
标准Modbus协议请参考:《MODBUS通讯协议中文版》
通用Modbus帧格式:
地址域 | 功能码 | 数据 | 查错校验
此出介绍最常用的帧格式:
byte1 | byte2 | byte3 byte4....| byte n | byte n+1
地址码 | 功能码 | 数据段 | CRC L | CRC H
用一个字节作为地址码(范围1-255,0通常作为广播地址),一个字节作为功能码(范围1-255,128-255为异常响应保留),地址码用于选择特定设备,功能码通知设备执行哪种操作。
功能码和数据段具体意义可自行设定。
如:定功能码 0x03 为读参数值,数据段2个字节,byte3位起始参数地址,byte4位参数个数。以对1号设备读 0x04地址开始的3个参数,数据帧为:
byte[] command = new byte[]{ 0x01, 0x03, 0x04, 0x03, CRCL, CRCH}
返回数据格式为:地址位,功能码,数据位字节数,第一个参数。。。。, 校验位
Byte[] response = new byte[]{0x01, 0x03, 0x03, 0x00, 0x00, 0x00, CRCL, CRCH}
4)发送与接收
使用串口工具类,实例化一个SerialPort对象,设置好串口参数并开启串口,此时就可以使用SerialPort.Write(command, 0, command.Length) 将命令发送出去;根据响应速度延时一定时间后,用SerialPort.Read(response, 0, response.Length) 接收响应。
以太网
1)Socket工具类介绍
Socket类有两个带参数的构造方法:
public Socket(SocketInformation socketInformation);
Public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);
第一个需要先构造一个带有所有Socket参数的参数类SocketInformation,不够直观,第二个参数非别是:地址族、套接字类型和协议。
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);//ipv4地址,字节流,tcp协议
socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.SendTimeout, timeOut); //设置发送超时时间
socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReceiveTimeout, timeOut);//设置接收超时时间
IPEndPoint ip = new IPEndPoint(IPAddress.Parse(IP), Port);//构造地址(ip+端口)
socket.Connect(ip);//建立连接
2)发送与接收
Modbus协议帧的构造与直连方式相同。
socket.Send(command );//发送数据
//延时
socket.Receive(data);//接收数据
代码写的不好,就不贴了。结束。