using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using TouchSocket.SerialPorts;
namespace TeamAAS_VP.Core
{
///
/// 扭力测量仪
///
public class Signal
{
//public static List sp = new List();
SerialPortClient client;
public static string BGSignalConfigPath = "..//Config//扭力测量仪配置文件.json";
SignalRS232Config _bGModbus;
public static string com;
public static string baudRate = "9600";
public static int parity = 0;
public static string dataBits = "8";
public static string stopBites = "1";
public static int readTimeOut = 1000;
public static bool isopen;
private static SerialPort sp = new SerialPort();
public async Task InitSignal()
{
if (File.Exists(BGSignalConfigPath))
{
try
{
var res = FileHelper.ReadJsonFile(BGSignalConfigPath);
if (res != null)
{
foreach (var port in res.PortName)
{
com = port;
OpenSerial(port, baudRate, parity, dataBits, stopBites, readTimeOut);
}
}
}
catch (Exception ex)
{
LogHelper.WriteLogError("读取后台ModbusTCP通讯文件时出错!", ex);
}
}
else
{
_bGModbus = new SignalRS232Config();
_bGModbus.PortName.Add("COM4");
FileHelper.WriteJsonFile(_bGModbus, BGSignalConfigPath);
}
}
private static bool OpenSerial(string strPortName, string strBaudRate, int parity, string strDataBits, string strStopBits, int ReadTimeout)
{
try
{
sp.PortName = strPortName;
sp.BaudRate = int.Parse(strBaudRate);
sp.DataBits = int.Parse(strDataBits);
sp.StopBits = (StopBits)int.Parse(strStopBits);
sp.ReadTimeout = ReadTimeout;
sp.Parity = (Parity)parity;
sp.Open();
return isopen = true;
}
catch (Exception ex)
{
LogHelper.WriteLogError("扭力测量仪连接失败", ex);
return isopen = false;
}
}
public static string SerialPortSendAndRecive(string strPortName, string strBaudRate, int parity, string strDataBits, string strStopBits, int ReadTimeout, string Sendstring)
{
try
{
if (isopen)
{
string result = SendAndRecive(Sendstring);
return result;
}
return "Open SerialPort Fail";
}
catch (Exception ex)
{
return "Send Fail" + ex.Message;
}
}
private static string SendAndRecive(string str)
{
try
{
byte[] array = strToHexByte(str.Trim());
sp.Write(array, 0, array.Length);
Thread.Sleep(100);
int bytesToRead = sp.BytesToRead;
byte[] array2 = new byte[bytesToRead];
sp.Read(array2, 0, bytesToRead);
string text = byteToHexStr(array2);
return text;
}
catch (Exception ex)
{
return "EOROR" + ex.Message;
}
}
public static string byteToHexStr(byte[] bytes)
{
string text = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
text = text + bytes[i].ToString("X2") + " ";
}
}
return text;
}
private static byte[] strToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if (hexString.Length % 2 != 0)
{
hexString += " ";
}
byte[] array = new byte[hexString.Length / 2];
for (int i = 0; i < array.Length; i++)
{
array[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Replace(" ", ""), 16);
}
return array;
}
public double SendAndReceive()
{
try
{
var data = SerialPortSendAndRecive(com, baudRate, parity, dataBits, stopBites, readTimeOut, "01 04 00 00 00 01 31 CA");
if (data == "Open SerialPort Fail")
{
MessageBox.Show("扭力测量仪连接失败");
}
else if (data.Contains("Send Fail"))
{
MessageBox.Show("扭力测量发送数据失败");
}
string[] parts = data.Split(' ');
string mystr = string.Join(" ", parts, 3, 4);
string hex = mystr.Replace(" ", ""); // 16 进制字符串
int decimalValue = Convert.ToInt32(hex, 16); // 转换为 10 进制整数
double response = decimalValue / 100.0;
return response;
}
catch (Exception ex)
{
LogHelper.WriteLogError("扭力测量仪接收信息时出错!", ex);
return 0;
}
}
}
public class SignalRS232Config
{
public ObservableCollection PortName { get; set; }
public SignalRS232Config()
{
PortName = new ObservableCollection();
}
}
}