You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

433 lines
17 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO.Ports;
using System.Threading;
using ZJ_BYD.ViewModel;
namespace ZJ_BYD.Untils
{
public class CAN1DeviceHelper : Singleton<CAN1DeviceHelper>
{
public DeviceInfo DeviceInfo { get; set; } = new DeviceInfo();
List<List<byte>> _dataList = new List<List<byte>>();
List<byte> _data = new List<byte>();
SerialPort _serialPort;
public void Run()
{
try
{
string PortName = ConfigurationManager.AppSettings["PortName"];
int BaudRate = int.Parse(ConfigurationManager.AppSettings["BaudRate"]);
int Parity = int.Parse(ConfigurationManager.AppSettings["Parity"]);
int DataBits = int.Parse(ConfigurationManager.AppSettings["DataBits"]);
int StopBits = int.Parse(ConfigurationManager.AppSettings["StopBits"]);
if (_serialPort != null && _serialPort.IsOpen)
{
_serialPort.Close();
}
_serialPort = null;
_dataList = new List<List<byte>>();
_data = new List<byte>();
_serialPort = new SerialPort
{
PortName = PortName,
BaudRate = BaudRate,
Parity = (Parity)Parity,
DataBits = DataBits,
StopBits = (StopBits)StopBits
};
_serialPort.DataReceived += _serialPort_DataReceived;
_serialPort.Open();
string sendString = "68 02 00 41 6C 17 16";
writeData(sendString);
Thread.Sleep(10);
sendString = "68 07 00 04 00 20 A1 07 00 00 3B 16";
writeData(sendString);
//1.发送软件编码
sendString = "68 07 00 04 00 20 A1 07 00 00 3B 16 68 13 00 02 00 01 00 00 08 00 B3 07 00 00 03 22 F1 94 55 55 55 55 3E 16 68 13 00 02 00 01 00 00 08 00 B3 07 00 00 30 00 00 00 00 00 00 00 70 16";
Info($"1.发送-->软件编码:{sendString}");
var writeResult1 = writeData(sendString);
if (!writeResult1.isok)
{
Info($"1.发送-->软件编码异常:{writeResult1.msg}");
}
getSoftwareCode();//解析软件编码
Info($"1.解析软件编码结果:{DeviceInfo.SoftwareCode}");
//2.发送引导报文
sendString = "68 13 00 02 00 01 00 00 08 00 B3 07 00 00 03 22 F1 80 55 55 55 55 2A 16 68 13 00 02 00 01 00 00 08 00 B3 07 00 00 30 00 00 00 00 00 00 00 70 16";
Info($"2.发送-->引导报文:{sendString}");
var writeResult2 = writeData(sendString);
if (!writeResult2.isok)
{
Info($"2.发送-->引导报文异常:{writeResult2.msg}");
}
getGuideVersion();//解析引导报文
Info($"2.解析引导报文结果:{DeviceInfo.GuideVersion}");
//3.清除故障
sendString = "68 13 00 02 00 01 00 00 08 00 B3 07 00 00 04 14 FF FF FF AA AA AA 53 16";
Info($"3.1发送-->清除故障:{sendString}");
byte[] sendBytes = HexStrToByteArray(sendString);
if (sendBytes == null)
{
return;
}
_serialPort.Write(sendBytes, 0, sendBytes.Length);
Thread.Sleep(500);
sendString = "68 13 00 02 00 01 00 00 08 00 B3 07 00 00 03 19 01 09 55 55 55 55 BA 16 68 13 00 02 00 01 00 00 08 00 B3 07 00 00 30 00 00 00 00 00 00 00 70 16";
Info($"3.2发送-->清除故障:{sendString}");
var writeResult3 = writeData(sendString);
if (!writeResult3.isok)
{
Info($"3.2发送-->清除故障异常:{writeResult3.msg}");
}
getClearFault();//解析清除故障
Info($"3.2解析清除故障结果:{DeviceInfo.ClearFault}");
//4.软件版本号
sendString = "68 13 00 02 00 01 00 00 08 00 72 06 00 00 00 01 00 00 00 00 00 00 FF 16";
Info($"4.发送-->软件版本号:{sendString}");
var writeResult4 = writeData(sendString);
if (!writeResult4.isok)
{
Info($"4.发送-->软件版本号异常:{writeResult4.msg}");
}
getSoftwareVersion();//解析软件版本号
Info($"4.解析软件版本号结果:{DeviceInfo.SoftwareVersion}");
//5.电压
getVoltage();
Info($"5.接收--电压:{DeviceInfo.Voltage}");
}
catch (Exception ex)
{
var msg = ex == null ? "与232模块通讯异常" : ex.Message;
Info($"DeviceHelper类中Run方法异常{msg}");
}
}
private (bool isok, string msg) writeData(string sendString)
{
try
{
_dataList.Clear();
byte[] sendBytes = HexStrToByteArray(sendString);
if (sendBytes == null)
{
return (false, $"将{sendString}字符串转成16进制时异常");
}
_serialPort.Write(sendBytes, 0, sendBytes.Length);
Thread.Sleep(200);
return (true, "");
}
catch (Exception ex)
{
var msg = ex == null ? "writeData异常" : $"writeData异常{ex.Message}";
return (false, msg);
}
}
private void getSoftwareCode()
{
try
{
DeviceInfo.SoftwareCode = string.Empty;
if (_dataList.Count > 0)
{
for (int i = 0; i < _dataList.Count; i++)
{
var item = _dataList[i];
if (item[14] == 0xBB && item[15] == 0x07)
{
if (item[18] == 0x10)
{
DeviceInfo.SoftwareCode += item[23].ToString("X2");
DeviceInfo.SoftwareCode += item[24].ToString("X2");
DeviceInfo.SoftwareCode += item[25].ToString("X2");
}
else if (item[18] == 0x21)
{
DeviceInfo.SoftwareCode += item[19].ToString("X2");
DeviceInfo.SoftwareCode += item[20].ToString("X2");
DeviceInfo.SoftwareCode += item[21].ToString("X2");
DeviceInfo.SoftwareCode += item[22].ToString("X2");
DeviceInfo.SoftwareCode += item[23].ToString("X2");
DeviceInfo.SoftwareCode += item[24].ToString("X2");
}
}
}
}
}
catch (Exception ex)
{
var msg = ex == null ? "操作异常" : ex.Message;
Info($"getSoftwareCode方法异常{msg}");
}
}
private void getGuideVersion()
{
try
{
DeviceInfo.GuideVersion = string.Empty;
if (_dataList.Count > 0)
{
for (int i = 0; i < _dataList.Count; i++)
{
var item = _dataList[i];
if (item[14] == 0xBB && item[15] == 0x07)
{
if (item[18] == 0x10)
{
DeviceInfo.GuideVersion += item[23].ToString() + ".";
DeviceInfo.GuideVersion += item[24].ToString() + ".";
DeviceInfo.GuideVersion += item[25].ToString() + ".";
}
else if (item[18] == 0x21)
{
DeviceInfo.GuideVersion += item[19].ToString() + ".";
DeviceInfo.GuideVersion += item[20].ToString() + ".";
DeviceInfo.GuideVersion += item[21].ToString() + ".";
DeviceInfo.GuideVersion += item[22].ToString() + ".";
DeviceInfo.GuideVersion += item[23].ToString() + ".";
DeviceInfo.GuideVersion += item[24].ToString();
}
}
}
}
}
catch (Exception ex)
{
var msg = ex == null ? "操作异常" : ex.Message;
Info($"getGuideVersion方法异常{msg}");
}
}
private void getClearFault()
{
try
{
DeviceInfo.ClearFault = string.Empty;
if (_dataList.Count > 0)
{
for (int i = 0; i < _dataList.Count; i++)
{
var item = _dataList[i];
if (item[14] == 0xBB && item[15] == 0x07 && item[18] == 0x06 && item[19] == 0x59)
{
DeviceInfo.ClearFault += item[23].ToString();
DeviceInfo.ClearFault += item[24].ToString();
break;
}
}
}
}
catch (Exception ex)
{
var msg = ex == null ? "操作异常" : ex.Message;
Info($"getClearFault方法异常{msg}");
}
}
private void getSoftwareVersion()
{
try
{
DeviceInfo.SoftwareVersion = string.Empty;
if (_dataList.Count > 1)
{
string year = string.Empty, month = string.Empty, day = string.Empty, times = string.Empty, version = string.Empty, version1 = string.Empty, version2 = string.Empty, version3 = string.Empty;
for (int i = 0; i < _dataList.Count; i++)
{
var item = _dataList[i];
if (item[18] == 0x51)
{
var yearVal = ByteArrayToInt(new byte[] { item[20], item[19] });
if (yearVal.HasValue)
{
year = yearVal.Value.ToString();
}
var monthVal = ByteArrayToInt(new byte[] { item[22], item[21] });
if (monthVal.HasValue)
{
month = monthVal.Value.ToString();
}
var dayVal = ByteArrayToInt(new byte[] { item[24], item[23] });
if (dayVal.HasValue)
{
day = dayVal.Value.ToString();
}
}
if (item[18] == 0x52)
{
var timsVal = ByteArrayToInt(new byte[] { item[20], item[19] });
if (timsVal.HasValue)
{
times = timsVal.Value.ToString();
}
var versionVal = ByteArrayToInt(new byte[] { item[21], item[23] });
if (versionVal.HasValue)
{
version = versionVal.Value.ToString().PadLeft(5, '0');
version1 = version.Substring(0, 1);
version2 = version.Substring(1, 2);
version3 = version.Substring(3, 2);
}
}
DeviceInfo.SoftwareVersion = $"{version1}.{version2}.{version3}.{year}.{month}.{day}.{times}";
}
}
}
catch (Exception ex)
{
var msg = ex == null ? "操作异常" : ex.Message;
Info($"getSoftwareVersion方法异常{msg}");
}
}
private void getVoltage()
{
try
{
DeviceInfo.Voltage = string.Empty;
if (_dataList.Count > 0)
{
String voltage1 = String.Empty, voltage2 = String.Empty;
foreach (List<byte> item in _dataList)
{
if (item.Count == 28 && item[14] == 0xDB && item[15] == 0x02)
{
voltage1 = ((double)item[22] / 10).ToString() + "V";
voltage2 = ((double)item[23] / 10).ToString() + "V";
DeviceInfo.Voltage = $"{voltage1},{voltage2}";
}
}
}
}
catch (Exception ex)
{
var msg = ex == null ? "操作异常" : ex.Message;
Info($"getVoltage方法异常{msg}");
}
}
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
byte[] read = new byte[_serialPort.BytesToRead];
_serialPort.Read(read, 0, read.Length);
foreach (byte b in read)
{
if (b == 0x68)
{
if (_data.Count == 28)
{
if (_data[14] == 0xBB && _data[15] == 0x07)
{
_dataList.Add(new List<byte>(_data));
}
else if (_data[14] == 0x73 && _data[15] == 0x06 && _data[16] == 0x00 && _data[17] == 0x00 && (_data[18] == 0x51 || _data[18] == 0x52))
{
_dataList.Add(new List<byte>(_data));
}
else if (_data[14] == 0xDB && _data[15] == 0x02)
{
_dataList.Add(new List<byte>(_data));
}
}
_data.Clear();
}
_data.Add(b);
}
}
catch (Exception ex)
{
var msg = ex == null ? "操作异常" : ex.Message;
Info($"_serialPort_DataReceived方法异常{msg}");
}
}
private static void Info(string info = "")
{
LogHelper.WriteLog(info);
}
/// <summary>
/// 字符串转16进制字节数组
/// </summary>
/// <param name="hexString"></param>
/// <returns></returns>
public byte[] HexStrToByteArray(string hexString)
{
try
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
hexString += " ";
byte[] returnBytes = new byte[hexString.Length / 2];
for (int i = 0; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
return returnBytes;
}
catch (Exception ex)
{
var msg = ex == null ? "操作异常" : ex.Message;
Info($"HexStrToByteArray方法将{hexString}字符串转成16进制时异常{msg}");
return null;
}
}
/// <summary>
/// 字节数组转Int32
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static int? ByteArrayToInt(byte[] bytes)
{
try
{
int mask = 0xff;
int temp = 0;
int n = 0;
for (int i = 0; i < bytes.Length; i++)
{
n <<= 8;
temp = bytes[i] & mask;
n |= temp;
}
return n;
}
catch (Exception ex)
{
var msg = ex == null ? "操作异常" : ex.Message;
Info($"ByteArrayToInt方法异常{msg}");
return null;
}
}
}
}