C#SerialPort的使用和介绍Modbus,TCP/IP,RS232,RS485,ModbusRTU和ModbusTCP的区别

一、SerialPort

参考:https://www.cnblogs.com/qyhe/articles/8590968.html
1.通过System.IO.Ports.SerialPort.GetPortNames() 将获得系统所有的串口名称,C#代码如下,

 string[] sPorts = SerialPort.GetPortNames(); //刷新端口选择,获取端口名称
 Array.Sort(sPorts);
 if (sPorts.Count() != 0)
 {
    foreach (string str in sPorts)
      {
           hoose_ports.Items.Add(str);//列出所有的串口
      }               
 }//此时,端口没有打开
 ///serialPort.Open();//是端口打开的语句

2.打开和关闭串口

SerialPort port = new SerialPort(ports[choose_ports.SelectedIndex], 9600, Parity.None, 8); //设置串口串口号、波特率、校验位、数据位
//或者设置成
           //SerialPort port = new SerialPort();
           //port.BaudRate = 9600;//波特率 //9600的波特率的信道,理论上每秒可以传输9600个二进制位,也就是9600/8个英文字母的数据量,也就是1200个字节          
           //port.PortName = "COM1";
           //port.Parity = Parity.None;//校验法:无
           //port.DataBits = 8;//数据位:8
           //port.StopBits = StopBits.One;//停止位:1
           try
           {
           port.ReceivedBytesThreshold = 1;//串口输入缓冲区获得新数据后,将检查缓冲区内已有的字节数,大于等于ReceivedBytesThreshold就会触发DataReceived事件
           port.DataReceived += port_DataReceived; //注册串口监听事件
           port.Open();//打开串口
           }
           catch(Exception ex)
           {
           MessageBox.Show(ex.Message);
           }
           if (port.IsOpen)//表示串口被占用
            {
                port.Close();//关闭串口
            }

3.DataReceived事件

private List<byte> buffer = new List<byte>();   //缓存串口数组
void port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    int nRead = port.BytesToRead;
    if (nRead > 0)
    {
        byte[] data = new byte[nRead];
        port.Read(data, 0, nRead);
        buffer.AddRange(data); 
    }
}

回调函数port_DataReceived用于响应DataReceived事件,通常在这个函数里读取串口数据。回调函数是被一个多线程调用的,它不在主线程内。所以,不要在这个回调函数里直接访问界面控件。可以使用Invoke或BeginInvoke。
4.流控制
串行通讯的双方,如果有一方反应较慢,另一方不停的发送数据,就可能造成数据的丢失。为了防止这种情况,需要使用流控制(也叫握手)
5.写数据

void Write(byte[] buffer,int offset,int count);//写二进制数据
void Write(char[] buffer,int offset,int count);//写二进制数据
void Write(string text);//写文本数据
void WriteLine(string text);//写一行数据 

Modbus,TCP/IP,RS232,RS485,ModbusRTU和ModbusTCP的区别

Modbus是一种协议,必须要有硬件为实现平台,而不同的硬件平台具有不同的电气特性和连接方式,,它既可以使用RS232、RS484作为物理层,他们需要用URAT作为链路层对物理层进行指挥,也可以用Ethernet定义的物理层、链路层,使用Ethernet时则配合TCP、IP分别作为传输层和网络层。
ModbusRTU和ModbusTCP两个协议的本质都是MODBUS协议,但所用的硬件接口不一样,Modbus RTU一般采用串口RS232C或RS485/422,而Modbus TCP一般采用以太网口。

在Java中处理串口通信通常需要使用`java.io`包下的`SerialPort`类,例如`javax.comm`库,它已经包含了对串口操作的基本支持。以下是一个简单的示例: ```java import javax.comm.*; public class SerialPortExample { public static void main(String[] args) { CommPortIdentifier portId = null; CommPort commPort = null; try { // 获取所有串口设备列表 portId = CommPortIdentifier.getPortIdentifiers(); if (portId.size() > 0) { CommPortIdentifier port = portId.nextElement(); // 检查是否是串口设备 if (port.getPortType() == CommPortType.COMPORT) { commPort = port.open("MySerialPortApp", 2000); // 设置波特率、数据位、停止位和校验位 ((SerialPort)commPort).setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); // 发送和接收数据 String dataToSend = "Hello from Java"; byte[] sendData = dataToSend.getBytes(); commPort.write(sendData, 0, sendData.length); InputStream inStream = commPort.getInputStream(); byte[] receivedBytes = new byte[1024]; int bytesRead = inStream.read(receivedBytes); String receivedData = new String(receivedBytes, 0, bytesRead); System.out.println("Received: " + receivedData); } } else { System.out.println("No serial ports found."); } } catch (Exception e) { e.printStackTrace(); } finally { if (commPort != null) { try { commPort.close(); } catch (IOException ex) { ex.printStackTrace(); } } } } } ``` 对于Modbus TCP/IP和UDP/IP,你可以使用第三方库如`modbus-java`, `j Modbus`, 或者`MODBUS-TCP-CLIENT-JAVA`等。这些库提供了一套完整的API来连接和读写Modbus协议的数据。例如: ```java import com.froglogic.jmodbus.ModbusClient; import com.froglogic.jmodbus.data.UDPMulticastTransport; // ... (其他依赖和配置) try { ModbusClient client = new ModbusClient(new UDPMulticastTransport(ipAddress, modbusPort)); client.connect(); // 发送请求(例如,读取输入寄存器) short[] inputRegisters = client.readInputRegisters(startingRegister, quantityOfRegisters); // 打印结果 for (short reg : inputRegisters) { System.out.println("Input Register: " + reg); } client.disconnect(); } catch (Exception e) { e.printStackTrace(); }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值