yanjinhui
2025-03-11 6eaa4ce46292314450fb725f67f27774945865cc
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Tasks/SerialPort/SerialPortTestJob.cs
@@ -1,177 +1,143 @@
/*using System.IO.Ports;
using System.Text;
using Quartz;
using WIDESEA_ISerialPortService;
using WIDESEAWCS_Model.Models;
//using System;
//using System.Collections.Generic;
//using System.IO.Ports;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
//using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
//using Quartz;
//using WIDESEA_ISerialPortRepository;
//using WIDESEA_SerialPortRepository;
//using WIDESEAWCS_Model.Models;
//using WIDESEAWCS_QuartzJob;
//namespace WIDESEAWCS_Tasks
//{
//    [DisallowConcurrentExecution]
//    public class SerialPortJob : JobBase, IJob
//    {
//        //dispatchinfo
//        //1   æµ‹è¯• OtherDevice WIDESEAWCS_Tasks SerialPortJob   1   NULL NULL    NULL   1   2025-02-19 14:55:02.167   NULL NULL
//        public enum CommandType
//        {
//            None = 0,
//            Get = 1,
//            Set = 2,
//        }
//        private readonly IPutakeRepository _putakeRepository;
//        private readonly INJCommandsRepository _nJCommandsRepository;
//        private readonly IProcessRepository _processRepository;
//        private readonly ITorqueOpRepository _orqueOpRepository;
//        public SerialPortJob(IPutakeRepository putakeRepository, INJCommandsRepository nJCommandsRepository, IProcessRepository processRepository, ITorqueOpRepository torqueOpRepository)
//        {
//            _putakeRepository = putakeRepository;
//            _nJCommandsRepository = nJCommandsRepository;
//            _processRepository = processRepository;
//            _orqueOpRepository = torqueOpRepository;
//        }
namespace WIDESEAWCS_Tasks
{
    public class SerialPortTestJob:IJob
    {
        // åœ¨ SerialPortTestService ç±»ä¸­æ·»åР坹 ISerialPortService çš„引用
        private readonly ISerialPortService _serialPortService;
        public readonly string _port;
        public SerialPort SerialPort { get; set; } =null!; //表示要打开的串口;可为空
        // æž„造函数
        public SerialPortTestJob(ISerialPortService serialPortService)
        {
            _serialPortService = serialPortService;
            _port = "COM3";
//        private static SerialPort serialPort;
//        private static CommandType commandType = CommandType.None;
//        //private string commandGet = "824070241JNT\r";//读值
//        //private string commandSet = "824070241JNT,0012500,+0001000[+TOL],-0001000[-TOL]\r";//设值
//        private string setOK = "ParseOK";
//        //private string getOK = "82407024103";
//        //private string getError = "82407024104";
//        public Task Execute(IJobExecutionContext context)
//        {
//            #region å…ˆæŸ¥åˆ°è¿™æ¡å‘½ä»¤
//            string commandSet = "";
//            string commandGet = "";
//            string getOK = "";
//            string getError = "";
            SerialPort = new SerialPort(_port);
//            var com = _nJCommandsRepository.QueryFirst(x => x.ID == 3);
//            if (com != null)
//            {
//                commandSet = string.Format("{0}JNT,{1},{2},{3}\r", com.DeviceNum, com.TorqueValue, com.TorqueMax, com.TorqueMin);//"824070241JNT,0005000,+0001000[+TOL],-0001000[-TOL]\r"
//                commandGet = string.Format("{0}\t", com.DeviceNum);// "824070241JNT\r"
//                getOK = string.Format("{0}03", com.DeviceNum);// "82407024103"
//                getError = string.Format("{0}04", com.DeviceNum);// "82407024104"
//            }
//            else
//            {
//                throw new Exception("未找到指定的命令数据!");
//            }
//            #endregion
            //串口接收到数据时,SerialPort ä¼šè‡ªåŠ¨è§¦å‘ DataReceived äº‹ä»¶
            //SerialPort.DataReceived += OnDataReceived; //接收串口发出的数据
        }
        private CancellationTokenSource _cancellationTokenSource;
        private Task _sendTask;
        private int commandType = 2;
        // å‘½ä»¤å­—符串
        private string command0 = "";  // ä¸å‘送命令
        private string command1 = "824070241JNT\r"; //发送信号
        private string command2 = "824070241JNT;0005000;+0001000[+TOL];-0001000[-TOL]\r"; //设值
        public Task Execute(IJobExecutionContext context)
        {
            //OpenSerialPort();
            SerialPort.DataReceived += OnDataReceived;
            return Task.CompletedTask;
        }
//            try
//            {
//                if (serialPort == null) { serialPort = new SerialPort("COM3"); serialPort.DataReceived += SerialPort_DataReceived; }
//                if (!serialPort.IsOpen)
//                {
//                    serialPort.Open();
        // ç”¨äºŽå­˜å‚¨æŽ¥æ”¶åˆ°çš„æ•°æ®
        private List<string> receivedDataList = new List<string>();
//                    serialPort.Write(commandSet);//打开串口时先设值
//                    commandType = CommandType.Set;
//                }
//                switch (commandType)
//                {
//                    case CommandType.Get://读值
//                        serialPort.Write(commandGet);
//                        break;
//                    case CommandType.Set://设值
//                        serialPort.Write(commandSet);
//                        break;
//                }
//            }
//            catch (Exception ex)
//            {
//                throw new Exception(ex.Message);
//            }
//            return Task.CompletedTask;
//        }
//        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
//        {
//            # region å…ˆæŸ¥åˆ°è¿™æ¡å‘½ä»¤
//            string getError = "";
//            string getOK = "";
        // æ‰“开串口并开始持续发送信号
        public void OpenSerialPort()
        {
            if (!SerialPort.IsOpen)
            {
                SerialPort.Open();
                StartSendingData();//开启后台循环
            }
        }
//            var com = _nJCommandsRepository.QueryFirst(x => x.ID == 3);
//            if (com != null)
//            {
//                getOK = string.Format("{0}03", com.DeviceNum);// "82407024103"
        // å…³é—­ä¸²å£å¹¶åœæ­¢å‘送信号
        public void CloseSerialPort()
        {
            if (SerialPort.IsOpen)
            {
                SerialPort.Close();
            }
        }
//                getError = string.Format("{0}04", com.DeviceNum);// "82407024104"
//            }
//            else
//            {
//                throw new Exception("未找到指定的命令数据!");
//            }
//            #endregion
        // å‘送数据一次
        public void SendData(string data)
        {
            if (SerialPort.IsOpen)
            {
                byte[] bytesToSend = Encoding.ASCII.GetBytes(data);
                SerialPort.Write(bytesToSend; 0; bytesToSend.Length);//将数据发送到串口
            }
        }
//            byte[] buffers = new byte[1024];
//            while (serialPort.BytesToRead > 0)
//            {
//                serialPort.Read(buffers, 0, serialPort.BytesToRead > buffers.Length ? buffers.Length : serialPort.BytesToRead);
//                string data = Encoding.Default.GetString(buffers);
//                if (data.Contains(setOK) && commandType == CommandType.Set)
//                {
//                    commandType = CommandType.Get;
//                }
//                else if (data.Contains(getOK) && commandType == CommandType.Get) //成功就保存到数据库中
//                {
//                    //这里如果成了就存到数据库中的torqueop表中,并且在这判断torqueop表中的数据size和步骤,是否满足工艺表所要求的
//                    //_orqueOpRepository.
        // èŽ·å–ä¸²å£çŠ¶æ€
        public bool GetSerialPortStatus()
        {
            return SerialPort.IsOpen;
        }
        // èŽ·å–æŽ¥æ”¶åˆ°çš„æ‰€æœ‰æ•°æ®
        public List<string> GetReceivedData()
        {
            return receivedDataList;
        }
        // å¤„理接收到的数据
        //每当串口收到数据时,会触发此方法
        private void OnDataReceived(object sender; SerialDataReceivedEventArgs e)
        {
            //从串口接收数据,并将接收到的数据转换为字符串
            byte[] buffer = new byte[1024];//一个字节数组 buffer,大小为 1024 å­—节
            int bytesRead = SerialPort.Read(buffer; 0; buffer.Length);//从串口流 SerialPort ä¸­è¯»å–数据并将其存入 buffer æ•°ç»„中。
            string receivedData = Encoding.ASCII.GetString(buffer; 0; bytesRead);//将接收到的字节数据转换成一个字符串
            //这里写一个方法用于判断每次receivedDat是否满足条件
            //截取设备编号后的俩为是否为03,03成功就进行下步
            string deviceCodePostfix = receivedData.Substring(9; 2);  // ç´¢å¼•从 9 å¼€å§‹ï¼Œé•¿åº¦ä¸º 2,即提取 "04"
            // æå–从第24位后的数据(例如 "0008000")
            string dataAfter24th = receivedData.Substring(13; 7);  // ä»Žç¬¬23位开始提取7个字符,得到 "0008000"
            if (deviceCodePostfix == "03")
            {
                //插入数据
                Dt_TorqueOp torqueOp = new Dt_TorqueOp
                {
                    TorqueSize = dataAfter24th
                };
                _serialPortService.AddSerialPort(torqueOp);
                //receivedDataList.Add(receivedData);
            }
//                    commandType = CommandType.Set;
//                }
//                else if (data.Contains(getError) && commandType == CommandType.Get)
//                {
//                    commandType = CommandType.Set;
           receivedDataList.Add(receivedData);
            // å¤„理命令切换逻辑
            if (commandType == 2 && receivedData.Contains("ParseOK"))
            {
                commandType = 1;
            }
            else if (commandType == 1 && (receivedData.Contains("82407024103") || receivedData.Contains("82407024104")))
            {
                commandType = 2;
            }
        }
        // å¯åŠ¨åŽå°ä»»åŠ¡ï¼Œæ¯éš”ä¸€æ®µæ—¶é—´å‘é€ä¿¡å·
        private void StartSendingData()
        {
            _cancellationTokenSource = new CancellationTokenSource();
            _sendTask = Task.Run(() =>
            {
                while (SerialPort.IsOpen)
                {
                    string command = command0;
                    //先判断commandType
                    if (commandType == 1)
                    {
                        command = command1;
                    }
                    else if (commandType == 2)
                    {
                        command = command2;
                    }
                    //再检查 command å­—符串是否为空或 null
                    if (!string.IsNullOrEmpty(command))
                    {
                        byte[] dataToSend = Encoding.ASCII.GetBytes(command);//将command转成字节数组
                        //(三个参数的含义,1数组,2从第0位开始截取,3是要发送的字节数,这里表示整个字节数组的长度)
                        SerialPort.Write(dataToSend; 0; dataToSend.Length);//最后向串口发送数据
                    }
                    Thread.Sleep(1000); // æ¯éš”1秒发送一次命令
                }
            });
        }
    }
}*/
//                }
//            }
//        }
//    }
//}