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.

255 lines
7.8 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 Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SlnMesnac.Common
{
public sealed class GunHelper
{
#region 单例实现
private static readonly GunHelper lazy = new GunHelper();
public static GunHelper Instance
{
get
{
return lazy;
}
}
#endregion
#region 变量定义
private static SerialPort serialPort = new SerialPort();
#endregion
/// <summary>
/// 喷码设备推送
/// </summary>
/// <param name="materialCodeStr"></param>
/// <param name="ip"></param>
public delegate void PushCode(string code);
public static event PushCode PushCodeEvent;
//初始化串口并启动接收数据
public void InstanceSerialPort()
{
try
{
//端口名 注:因为使用的是USB转RS232 所以去设备管理器中查看一下虚拟com口的名字
serialPort.PortName = "COM3";// portName;
//波特率 霍尼威尔扫码枪115200,普通9600
serialPort.BaudRate = 9600;
//奇偶校验
serialPort.Parity = Parity.None;
//停止位
serialPort.StopBits = StopBits.One;
//数据位
serialPort.DataBits = 0x8;
//忽略null字节
serialPort.DiscardNull = true;
//接收事件
serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
//开启串口
serialPort.Open();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string result = "";
int bytesToRead = serialPort.BytesToRead;
byte[] buf = new byte[bytesToRead];
serialPort.Read(buf, 0x0, bytesToRead);
for (int i = 0x0; i < buf.Length; i++)
{
int num = (int)buf[i];
result =result+num.ToString("X2");
}
Console.WriteLine(result);
}
/// <summary>
/// 发送数据方法
/// OK-校验成功关闭灯光NG-校验失败闪烁红灯
/// </summary>
/// <param name="data"></param>
public void SendData(string data)
{
//try
//{
// if (serialPort.IsOpen)
// {
// if (data == "NG")
// {
// byte[] buffer = GetBytesByCommand("CloseRed");
// serialPort.Write(buffer, 0x0, 0x4);
// byte[] buffer1 = GetBytesByCommand("OpenRed");
// serialPort.Write(buffer1, 0x0, 0x4);
// }
// else if (data == "OK")
// {
// byte[] buffer = GetBytesByCommand("CloseRed");
// serialPort.Write(buffer, 0x0, 0x4);
// byte[] buffer1 = GetBytesByCommand("OpenGreen");
// serialPort.Write(buffer1, 0x0, 0x4);
// }
// else if (data == "Exit")
// {
// byte[] buffer = GetBytesByCommand("CloseRed");
// serialPort.Write(buffer, 0x0, 0x4);
// }
// }
// else
// {
// Console.WriteLine("串口未打开,请先初始化串口并打开连接。");
// }
//}
//catch (Exception ex)
//{
// Console.WriteLine($"发送数据时发生错误:{ex.Message}");
//}
}
/// <summary>
/// 条码根据通信协议转换
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
private byte[] GetBytesByCommand(string barCode)
{
byte[] buffer = null;
//byte[] SOI = new byte[] { 0x7E };
//byte[] OrderID = new byte[] { 0x02 };
//byte[] MemoID = new byte[] { 0x00 };
//byte[] Info = EncodeInfoData(barCode);
//byte[] Length = GetLength(Info.Length);
//byte CheckSum = GetCheckSum(OrderID,MemoID,Length,Info);
//byte[] EOI = new byte[] { 0x0D };
// 起始结束7E\0D; SOI OrderID MemoID Length Info CheckSum EOI
// buffer = new byte[] { 0x7E, 0x01, 0x00, Length, iNFO, CheckSum, 0x0D };
return buffer ;
}
//private byte[] GetLength(int length)
//{
//}
private byte[] GetCheckSum(byte[] OrderID, byte[] MemoID, byte[] Length, byte[] Info)
{
// 合并所有数据部分,除去 SOI 和 EOI
List<byte> dataList = new List<byte>();
dataList.AddRange(OrderID);
dataList.AddRange(MemoID);
dataList.AddRange(Length);
dataList.AddRange(Info);
// 计算数据的总和
int sum = 0;
foreach (byte b in dataList)
{
sum += b;
}
// 取模 65536
int moduloResult = sum % 65536;
// 求反并加1
ushort lCheckSUM = (ushort)((~moduloResult & 0xFFFF) + 1);
// 转换为字节数组传输时用4个字节
byte[] checkSumBytes = new byte[4];
checkSumBytes[0] = (byte)((lCheckSUM >> 8) & 0xFF); // 高位
checkSumBytes[1] = (byte)(lCheckSUM & 0xFF); // 低位
checkSumBytes[2] = 0; // 额外的两个字节可以填充为0
checkSumBytes[3] = 0;
return checkSumBytes;
}
public byte[] EncodeInfoData(string data)
{
// 分隔符
byte separator = 0x1F;
// 将数据和useFileName转换成字节序列
byte[] dataBytes = EncodeDataForTransmission(data);
// 组合所有字节序列
List<byte> encodedBytes = new List<byte>();
encodedBytes.AddRange(dataBytes);
encodedBytes.Add(separator);
return encodedBytes.ToArray();
}
byte[] EncodeDataForTransmission(string input)
{
byte[] encodedBytes = new byte[input.Length * 2]; // 每个字符转换为两个字节
for (int i = 0; i < input.Length; i++)
{
char c = input[i];
// 将字符转换为ASCII码
byte asciiValue = (byte)c;
// 将ASCII码拆分为高4位和低4位
byte highNibble = (byte)((asciiValue >> 4) & 0xF); // 高4位
byte lowNibble = (byte)(asciiValue & 0xF); // 低4位
// 转换成ASCII码形式
byte highNibbleAscii = (byte)(highNibble + 0x30); // 转成ASCII码
byte lowNibbleAscii = (byte)(lowNibble + 0x30); // 转成ASCII码
// 存储到结果数组中
encodedBytes[2 * i] = highNibbleAscii;
encodedBytes[2 * i + 1] = lowNibbleAscii;
}
return encodedBytes;
}
}
}