DauxiKS107Controller.cs 3.0 KB
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

public class DauxiKS107Controller
{
    private static int baudRate =9600;//波特率
    private static Parity parity = Parity.None;//校验位
    private static int dataBits = 8;//数据位
    private static StopBits stopBits = StopBits.One; //停止位

    private SerialPort _serialPort = null;
    string comPortName;
    System.Timers.Timer timer;
    public bool IsAlarm;
    public DauxiKS107Controller()
    {
        timer = new System.Timers.Timer(5*60*1000);
        timer.Elapsed += Timer_Elapsed;
        timer.AutoReset = true;
        IsAlarm = false;
    }
    ~DauxiKS107Controller() {
        LogUtil.info($"液位传感器退出");
        timer.Enabled = false;
        if (_serialPort != null) {
            _serialPort.Close();
        }
    }
    private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Quary(out int value, out string errmsg);
        LogUtil.info($"读取到液位:{value}mm,err:{errmsg}");
        if (value > 0)
        {
            IsAlarm = value < 180;
        }
    }
    
    /// <summary> 
    /// 打开串口资源 
    /// <returns>返回bool类型</returns>  
    /// </summary> 
    public bool OpenPort(string _comport,out string errmsg)
    {

        comPortName = _comport;
        _serialPort = new SerialPort(comPortName, baudRate, parity, dataBits, stopBits);
        _serialPort.RtsEnable = true;  //自动请求
        _serialPort.ReadTimeout = 100;//超时
        errmsg = "";
        bool ok = false;
        //如果串口是打开的,先关闭 
        if (_serialPort.IsOpen)
            _serialPort.Close();
        try
        {
            //打开串口
            _serialPort.Open();

            for (int i = 1; i < 10; i++) {
                Thread.Sleep(100);
                Quary(out int value, out _);
                if (value > 0)
                {
                    timer.Enabled = true;
                    ok = true;
                    break;
                }
            }
        }
        catch (Exception Ex)
        {
            errmsg = Ex.ToString();
            //throw Ex;
        }
        return ok;
    }
    static byte[] quarycommand = new byte[] { 0xe8, 0x02, 0xb0 };
    public bool Quary(out int value, out string errmsg) {
        errmsg = "";
        byte[] buf = new byte[50];
        value = 0;
        try
        {
            _serialPort.Write(quarycommand, 0, quarycommand.Length);
            Thread.Sleep(10);
            var readlen = _serialPort.Read(buf, 0, buf.Length);
            if (readlen >= 2)
            {
                var c = new byte[] { buf[1], buf[0] };
                value = (int)BitConverter.ToUInt16(c, 0);
            }
            else
            {
                return false;
            }
        }
        catch (Exception ex){
            errmsg = ex.ToString();
            return false;
        }
        return true;
    }
}