台州海关TD3600上线版本
This commit is contained in:
157
JJMediSys/cs/ComTool.cs
Normal file
157
JJMediSys/cs/ComTool.cs
Normal file
@@ -0,0 +1,157 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace JJMediSys
|
||||
{
|
||||
public class ComTool
|
||||
{
|
||||
SerialPort serialPort;
|
||||
/// <summary>
|
||||
/// 打开串口
|
||||
/// </summary>
|
||||
/// <param name="protName">串口号</param>
|
||||
/// <param name="baudRate">波特率</param>
|
||||
/// <param name="dataBit">数据位</param>
|
||||
/// <param name="stopBits">停止位</param>
|
||||
/// /// <param name="parity">校验位</param>
|
||||
/// <returns></returns>
|
||||
public bool OpenCom(string protName, int baudRate, int dataBit, float stopBits, int parity)
|
||||
{
|
||||
bool flag = true;
|
||||
if (serialPort == null)
|
||||
{
|
||||
serialPort = new SerialPort();
|
||||
}
|
||||
serialPort.PortName = protName;//串口号
|
||||
serialPort.BaudRate = baudRate;//波特率
|
||||
float f = stopBits;//停止位
|
||||
if (f == 0)
|
||||
{
|
||||
serialPort.StopBits = StopBits.None;
|
||||
}
|
||||
else if (f == 1.5)
|
||||
{
|
||||
serialPort.StopBits = StopBits.OnePointFive;
|
||||
}
|
||||
else if (f == 1)
|
||||
{
|
||||
serialPort.StopBits = StopBits.One;
|
||||
}
|
||||
else
|
||||
{
|
||||
serialPort.StopBits = StopBits.Two;
|
||||
}
|
||||
|
||||
serialPort.DataBits = dataBit;//数据位
|
||||
|
||||
if (parity == 0)
|
||||
{
|
||||
serialPort.Parity = Parity.None;
|
||||
}
|
||||
else if (parity == 1)
|
||||
{
|
||||
serialPort.Parity = Parity.Odd;
|
||||
}
|
||||
else if (parity == 2)
|
||||
{
|
||||
serialPort.Parity = Parity.Even;
|
||||
}
|
||||
else
|
||||
{
|
||||
serialPort.Parity = Parity.None;
|
||||
}
|
||||
|
||||
// sp.ReadTimeout = 1000;//设置超时读取时间
|
||||
// sp.WriteTimeout = 1000;//超时写入时间
|
||||
try
|
||||
{
|
||||
if (!serialPort.IsOpen)
|
||||
{
|
||||
serialPort.Open();
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
string msg = ex.Message;
|
||||
flag = false;
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
/// <summary>
|
||||
/// 关闭端口
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool CloseCom()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (serialPort.IsOpen)
|
||||
{
|
||||
serialPort.Close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool isOpen()
|
||||
{
|
||||
return serialPort.IsOpen;
|
||||
}
|
||||
|
||||
public byte[] SendAndRecv(byte[] sendData, int timeout = 5000)
|
||||
{
|
||||
//打开连接
|
||||
if (!serialPort.IsOpen) serialPort.Open();
|
||||
serialPort.DiscardInBuffer();
|
||||
//发送数据
|
||||
serialPort.Write(sendData, 0, sendData.Length);
|
||||
|
||||
//读取返回数据
|
||||
DateTime dt = DateTime.Now;
|
||||
while (serialPort.BytesToRead < 2)
|
||||
{
|
||||
Thread.Sleep(50);
|
||||
if (DateTime.Now.Subtract(dt).TotalMilliseconds > timeout)
|
||||
{
|
||||
throw new Exception("主版无响应");
|
||||
}
|
||||
}
|
||||
List<byte> recList = new List<byte>();
|
||||
byte[] recData = new byte[serialPort.BytesToRead];
|
||||
byte[] Heard = new byte[2];
|
||||
serialPort.Read(Heard, 0, 2);
|
||||
recList.AddRange(Heard);
|
||||
int length = Heard[1] + 3; //报文数据总长度
|
||||
while (recList.Count < length)
|
||||
{
|
||||
if (serialPort.BytesToRead > 0)
|
||||
{
|
||||
int ToRead = 0;
|
||||
if (serialPort.BytesToRead > (length - recList.Count))
|
||||
{
|
||||
ToRead = length - recList.Count;
|
||||
}
|
||||
else
|
||||
{
|
||||
ToRead = serialPort.BytesToRead;
|
||||
}
|
||||
recData = new byte[ToRead];
|
||||
serialPort.Read(recData, 0, ToRead);
|
||||
recList.AddRange(recData);
|
||||
}
|
||||
Thread.Sleep(1);
|
||||
}
|
||||
return recList.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user