using
System;
using
System.IO.Ports;
using
System.Threading;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace
TripodDemo
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
public class SerialTripo : IDisposable
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private object objComm = new object();
private SerialPort com;
private bool disposed = false;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
SerialPort#region SerialPort
public SerialTripo()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
com = new SerialPort("COM1", 9600);
OpenCom();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public SerialTripo(SerialPort sp)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
com = sp;
OpenCom();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void OpenCom()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
try
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (!com.IsOpen)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
com.ReadTimeout = 3000;
com.WriteTimeout = 3000;
com.Open();
}
}
catch (Exception ex)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw new Exception(ex.Message);
}
}
#endregion
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
Dispose & Close#region Dispose & Close
public void Dispose()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Dispose(true);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private void Dispose(bool disposing)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (!disposed && disposing && com != null && com.IsOpen)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
com.Close();
disposed = true;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public void Close()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Dispose(true);
}
#endregion
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
发送数据#region 发送数据
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 发送数据
/// </summary>
/// <param name="bwrite">写数据</param>
/// <param name="returnDataLen">读数据长度</param>
/// <param name="bread">读数据</param>
/// <param name="msel">超时毫秒</param>
/// <returns>是否执行成功</returns>
private bool SendData(byte[] bwrite, int returnDataLen, out byte[] bread, int msel)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
lock (objComm)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
bread = new byte[returnDataLen];
long l = DateTime.UtcNow.Ticks + msel * 10000;
com.DiscardInBuffer();
com.DiscardOutBuffer();
com.Write(bwrite, 0, bwrite.Length);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
while (com.BytesToRead < returnDataLen && DateTime.UtcNow.Ticks < l)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Thread.Sleep(1);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//串口无反应
if (com.BytesToRead < returnDataLen)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return false;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
try
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
com.Read(bread, 0, bread.Length);
return true;
}
catch (TimeoutException)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return false;
}
}
}
#endregion
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 操作设备(如开闸)
/// </summary>
/// <param name="macno">机号</param>
/// <returns>是否执行成功</returns>
public bool OpenStorbe(byte macno)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int retLen = 5;
byte[] br;
//构建命令
byte b1 = 0xEB;
byte b3 = 0x50;
byte b4 = 0x01;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
byte xor = (byte)(b1 ^ macno ^ b3 ^ b4);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
byte[] bw =
{ b1, macno, b3, b4, xor };
bool bRet = SendData(bw, retLen, out br, 1000);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (bRet)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (br[2] == 0xC0 && br[3] == 0x00)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return true;
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return false;
}
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return false;
}
}
}
}
转载于:https://www.cnblogs.com/chenzz/archive/2008/04/19/1161446.html