163 lines
4.5 KiB
C#
163 lines
4.5 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Text;
|
||
using System.Threading;
|
||
using Microsoft.VisualBasic;
|
||
using System.IO.Ports;
|
||
using CommonClassLib;
|
||
namespace SimensSerialPort
|
||
{
|
||
/// <summary>
|
||
/// Create by Richard.liu 2008
|
||
/// Simens PLC通讯类,RS232的自由口协议
|
||
/// </summary>
|
||
public class CSimensSerialPort
|
||
{
|
||
SerialPort com;
|
||
bool _ifInit;
|
||
short _portNo;
|
||
string _settings;
|
||
|
||
/// <summary>
|
||
/// 初始化PLC自由口协议通讯类
|
||
/// </summary>
|
||
/// <param name="Portno">计算机串口(COM口)号:1,2,3,4,5,6,7,8</param>
|
||
/// <param name="Settings">通讯设置:9600,None,8,One;分隔符使用全角“,”</param>
|
||
public CSimensSerialPort(short Portno, string Settings)
|
||
{
|
||
|
||
_portNo = Portno;
|
||
_settings = Settings;
|
||
com = new SerialPort();
|
||
|
||
}
|
||
string _ComError;
|
||
|
||
|
||
public string ComError
|
||
{
|
||
get { return _ComError; }
|
||
set { _ComError = value; }
|
||
}
|
||
public bool InitCom()
|
||
{
|
||
|
||
try
|
||
{
|
||
|
||
if (com.IsOpen == true)
|
||
{
|
||
com.Close();
|
||
}
|
||
com.PortName ="COM"+ _portNo.ToString();
|
||
char[] cc = new char[1] { ','};
|
||
string[] split = _settings.Split(cc);
|
||
com.BaudRate =Convert.ToInt32( split[0]);
|
||
com.Parity = Parity.None;//(Parity)Convert.ChangeType(split[1], typeof(Parity));
|
||
com.DataBits = Convert.ToInt32(split[2]);
|
||
com.StopBits = StopBits.One;// (StopBits)Convert.ChangeType(split[3], typeof(StopBits));
|
||
|
||
com.Open();
|
||
_ifInit = true;
|
||
return true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
_ComError = "通讯端口:" + _portNo + "初始化失败!" + ex.Message;
|
||
return false;
|
||
}
|
||
|
||
|
||
}
|
||
public byte[] ReadCom(short InBufCount)
|
||
{
|
||
if (_ifInit == false)
|
||
InitCom();
|
||
int i = 0;
|
||
try
|
||
{
|
||
do
|
||
{
|
||
i++;
|
||
if (i > 5)
|
||
break;
|
||
Thread.Sleep(300);
|
||
|
||
} while (com.BytesToRead < InBufCount);
|
||
if (com.BytesToRead <= 0)
|
||
{
|
||
_ComError = "在串口输入缓冲区内没有要接收到的数据!";
|
||
return null;
|
||
}
|
||
byte[] inbyte = new byte[InBufCount];
|
||
com.Read(inbyte, 0, InBufCount);
|
||
//CCarryConvert.WriteDarkCasket(this.ToString(), "Read", com.PortName, inbyte);
|
||
return inbyte;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
_ComError = ex.Message;
|
||
return null;
|
||
}
|
||
}
|
||
public string ReadCom()
|
||
{
|
||
if (_ifInit == false)
|
||
InitCom();
|
||
try
|
||
{
|
||
string gets = com.ReadExisting();
|
||
//CCarryConvert.WriteDarkCasket(this.ToString(), "ReadExisting", com.PortName, gets);
|
||
return gets;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
_ComError = ex.Message;
|
||
return null;
|
||
}
|
||
}
|
||
public bool WriteCom(string wData)
|
||
{
|
||
if (_ifInit == false)
|
||
InitCom();
|
||
try
|
||
{
|
||
|
||
com.Write( wData);
|
||
//CCarryConvert.WriteDarkCasket(this.ToString(), "Write", com.PortName, wData);
|
||
return true;
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
_ComError = "写串口缓冲区失败!" + ex.Message;
|
||
return false;
|
||
}
|
||
}
|
||
public bool WriteCom(byte[] wData)
|
||
{
|
||
if (_ifInit == false)
|
||
InitCom();
|
||
try
|
||
{
|
||
//com.WriteBufferSize = 0;
|
||
com.Write(wData, 0, wData.GetUpperBound(0)+1);
|
||
//CCarryConvert.WriteDarkCasket(this.ToString(), "Write", com.PortName, wData);
|
||
return true;
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
_ComError = "写串口缓冲区失败!" + ex.Message;
|
||
return false;
|
||
|
||
|
||
}
|
||
}
|
||
public void CloseCom()
|
||
{
|
||
if (com.IsOpen==true) com.Close();
|
||
}
|
||
}
|
||
}
|