Files
2026-05-04 14:46:58 +08:00

67 lines
1.8 KiB
C#

using System;
using System.IO.Ports;
using System.Text;
using System.Threading;
namespace ShanghaiEnvironmentalTechnology
{
public class RS485Communicator
{
private SerialPort _serialPort;
private bool _isListening;
public event Action<string> DataReceived;
public RS485Communicator(string portName, int baudRate = 19200, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One)
{
_serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits)
{
ReadTimeout = 500,
WriteTimeout = 500
};
_serialPort.DataReceived += SerialPort_DataReceived;
}
public void Open()
{
if (!_serialPort.IsOpen)
{
_serialPort.Open();
_isListening = true;
}
}
public void Close()
{
if (_serialPort.IsOpen)
{
_isListening = false;
_serialPort.Close();
}
}
public void SendData(string data)
{
if (_serialPort.IsOpen)
{
byte[] bytesToSend = Encoding.ASCII.GetBytes(data);
_serialPort.Write(bytesToSend, 0, bytesToSend.Length);
}
else
{
throw new InvalidOperationException("Serial port is not open.");
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (_isListening && _serialPort.IsOpen)
{
string receivedData = _serialPort.ReadLine();
DataReceived?.Invoke(receivedData);
}
}
}
}