using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Base
{
public class SerialPortControl
{
public bool Create(string portName, int baudRate, Parity parity, StopBits stopBit, int dataBit, Handshake handshake, int timeOut, ref SerialPort serialPort)
{
try
{
serialPort = new SerialPort();
serialPort.PortName = portName;
serialPort.BaudRate = baudRate;//波特率
serialPort.Parity = parity;
serialPort.StopBits = stopBit;//停止位
serialPort.DataBits = dataBit;//数据位8
serialPort.Handshake = handshake;//控制流
serialPort.ReadTimeout = timeOut;
serialPort.WriteTimeout = timeOut;
return true;
}
catch (Exception e)
{
return false;
}
}
public bool Open(ref SerialPort serialPort)
{
try
{
if (serialPort != null) serialPort.Open();
return serialPort.IsOpen;
}
catch (Exception e)
{
return false;
}
}
public bool Send(SerialPort serialPort, string sendMsg)
{
serialPort.Write(sendMsg);
return true;
}
public bool Send(SerialPort serialPort, char[] sendMsg)
{
serialPort.Write(sendMsg, 0, sendMsg.Length);
return true;
}
public string Read(SerialPort serialPort)
{
int len = serialPort.BytesToRead;
Byte[] readBuffer = new Byte[len];
serialPort.Read(readBuffer, 0, len); //将数据读入缓存
//len = serialPort.ReadChar();
//char[] data = new Char[serialPort.ReadChar()];
//serialPort.Read(data, 0, len);
return Encoding.Default.GetString(readBuffer);
//char[] data = new Char[serialPort.ReadChar()];
//serialPort.Read(data, 0, serialPort.ReadChar());
//string str = "";
//for (int i = 0; i < data.Length; i++)
//{
// str += Convert.ToInt32(data, 16);
//}
//return Encoding.Default.GetString(data);
}
public void Close(SerialPort serialPort)
{
if(serialPort != null) serialPort.Close();
}
/// <summary>
/// 发送字符串
/// </summary>
/// <param name="serialPort"></param>
/// <param name="sendStr"></param>
/// <param name="recStr"></param>
/// <returns></returns>
public bool SendAndReadString(SerialPort serialPort, string sendStr, ref string recStr)
{
try
{
serialPort.DiscardInBuffer();
serialPort.DiscardOutBuffer();
serialPort.Write(sendStr);
long startTime = DateTime.Now.Ticks / 10000;
long endTime = 0;
while (endTime - startTime <= serialPort.ReadTimeout)
{
int len = serialPort.BytesToRead;
byte[] readBuffer = new byte[len];
serialPort.Read(readBuffer, 0, len); //将数据读入缓存
recStr = Encoding.Default.GetString(readBuffer);
if (recStr.Length > 0) return true;
if (serialPort.ReadTimeout > 0) endTime = DateTime.Now.Ticks / 10000;
}
return false;
}
catch (Exception ex) { MyLog.saveException("SerialPortTool操作类Read异常" + "," + ex.Message + ":" + ex.ToString()); return false; }
}
/// <summary>
/// 16进制发送
/// </summary>
/// <param name="serialPort"></param>
/// <param name="sendStr"></param>
/// <param name="recStr"></param>
/// <param name="isRecSorce"></param>
/// <returns></returns>
public bool SendAndReadHexString(SerialPort serialPort, string sendStr, ref string recStr, bool isRecSorce)
{
try
{
if (!serialPort.IsOpen) return false;
byte[] sendByte = HexStringToByteArray(sendStr);
serialPort.DiscardInBuffer();
serialPort.DiscardOutBuffer();
serialPort.Write(sendByte, 0, sendByte.Length);
long startTime = DateTime.Now.Ticks / 10000;
long endTime = 0;
while (endTime - startTime <= serialPort.ReadTimeout)
{
int len = serialPort.BytesToRead;
byte[] readBuffer = new byte[len];
serialPort.Read(readBuffer, 0, len); //将数据读入缓存
if (!isRecSorce) recStr = Encoding.Default.GetString(readBuffer);
if (isRecSorce)
{
byte[] vs = new byte[] { readBuffer[3], readBuffer[4], readBuffer[5], readBuffer[6] };
recStr = ByteArrayToHexString(vs);//0103040000006BBBDC
int a = Convert.ToInt32(recStr, 16);
recStr = a.ToString();
};
if (recStr.Length > 0) return true;
if (serialPort.ReadTimeout > 0) endTime = DateTime.Now.Ticks / 10000;
}
return false;
}
catch (IndexOutOfRangeException) { return false; }
catch (ArgumentOutOfRangeException) { return false; }
catch (Exception ex) { MyLog.saveException("SerialPortTool操作类SendAndRead异常" + "," + ex.Message + ":" + ex.ToString()); return false; }
}
//16进制字符串转化为字节数组
private byte[] HexStringToByteArray(string s)
{
s = s.Replace(" ", "");
byte[] buffer = new byte[s.Length / 2];
for (int i = 0; i < s.Length; i += 2)
buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
return buffer;
}
//字节数组转化为16进制字符串
private string ByteArrayToHexString(byte[] data)
{
StringBuilder sb = new StringBuilder(data.Length * 3);
foreach (byte b in data)
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
return sb.ToString().ToUpper();
}
}
}