📄 sercomm.cs
字号:
get
{
String retval = "";
switch (mbytParity)
{
case EVENPARITY:
retval = "E";
break;
case MARKPARITY:
retval = "M";
break;
case NOPARITY:
retval = "N";
break;
case ODDPARITY:
retval = "O";
break;
case SPACEPARITY:
retval = "S";
break;
}
return retval;
}
set
{
if (value.Length > 1)
value = value.Substring(0,1);
switch (value)
{
case "E":
mbytParity = EVENPARITY;
break;
case "M":
mbytParity = MARKPARITY;
break;
case "N":
mbytParity = NOPARITY;
break;
case "O":
mbytParity = ODDPARITY;
break;
case "S":
mbytParity = SPACEPARITY;
break;
default:
throw new Exception("无效的奇偶属性!");
}
}
}
#endregion
#region "PortOpen"
public bool PortOpen
{
get
{
if (mintHandle == INVALID_HANDLE_VALUE)
return false;
else
return true;
}
set
{
if (value)
mintHandle = Open(mintPort, mintBaudRate, mbytParity, mbytDataBits, mbytStopBits, mintTXBufferSize, mintRXBufferSize, mintTimeout);
else
mintHandle = Close(mintHandle);
}
}
#endregion
#region "StopBits"
public int StopBits
{
get
{
int retval = 0;
switch (mbytStopBits)
{
case STOPBITS_10:
retval = 1;
break;
case STOPBITS_15:
retval = 2;
break;
case STOPBITS_20:
retval = 3;
break;
}
return retval;
}
set
{
switch (value)
{
case 1:
mbytStopBits = STOPBITS_10;
break;
case 2:
mbytStopBits = STOPBITS_15;
break;
case 3:
mbytStopBits = STOPBITS_20;
break;
default:
throw new Exception("无效的停止位!");
}
}
}
#endregion
#region "Timeout"
public int Timeout
{
get
{
return mintTimeout;
}
set
{
mintTimeout = value;
}
}
#endregion
#endregion
#region "public instance methods"
#region "Input"
public String Input()
{
return Input(0);
}
public string Input(int BytesToRead)
{
string result = "";
int intResult;
ASCIIEncoding objEncoder = new ASCIIEncoding();
int lpNumberOfBytesRead = 0;
OVERLAPPED lpOverlapped;
if (BytesToRead == 0)
BytesToRead = mintRXBufferSize;
if (mintHandle != INVALID_HANDLE_VALUE)
{
mbytRxBuffer = new byte[BytesToRead];
lpOverlapped = new OVERLAPPED();
intResult = ReadFile(mintHandle, mbytRxBuffer, BytesToRead, ref lpNumberOfBytesRead, ref lpOverlapped);
if (intResult == 0)
{
mintHandle = INVALID_HANDLE_VALUE;
throw new Exception("读COM:" + mintPort.ToString() +"时发生错误!");
}
else
{
result = objEncoder.GetString(mbytRxBuffer, 0, BytesToRead);
}
}
return result;
}
#endregion
#region "Constructors"
public Comm()
{
}
public Comm(int port, int baudrate, String parity, int databits, int stopbits)
{
mintPort = port;
mintBaudRate = baudrate;
switch (parity)
{
case "E":
mbytParity = EVENPARITY;
break;
case "M":
mbytParity = MARKPARITY;
break;
case "O":
mbytParity = ODDPARITY;
break;
case "S":
mbytParity = SPACEPARITY;
break;
default:
mbytParity = NOPARITY;
break;
}
switch (databits)
{
case 7:
mbytDataBits = DATABITS_7;
break;
default:
mbytDataBits = DATABITS_8;
break;
}
switch (stopbits)
{
case 2:
mbytStopBits = STOPBITS_15;
break;
default:
mbytStopBits = STOPBITS_10;
break;
}
}
#endregion
#region "Output"
public void Output(String Value)
{
int intResult;
int lpNumberOfBytesWritten = 0;
OVERLAPPED lpOverlapped = new OVERLAPPED();
ASCIIEncoding objEncoder = new ASCIIEncoding();
if (mintHandle != INVALID_HANDLE_VALUE)
{
mbytTxBuffer = new byte[Value.Length];
mbytTxBuffer = objEncoder.GetBytes(Value);
intResult = WriteFile(mintHandle, mbytTxBuffer, mbytTxBuffer.Length, ref lpNumberOfBytesWritten, ref lpOverlapped);
}
}
#endregion
#endregion
#region "private instance methods"
#region "Open"
private int Open(int port, int baudrate, byte parity, byte databits, byte stopbits, int txbuffersize, int rxbuffersize,int timeout )
{
int intResult;
int intHandle = INVALID_HANDLE_VALUE;
COMMTIMEOUTS lpCommTimeouts;
DCB lpDCB;
if (port > 0)
{
if (intHandle == INVALID_HANDLE_VALUE)
{
Close(intHandle);
}
else
{
return INVALID_HANDLE_VALUE;
}
intHandle = CreateFile("COM" + port.ToString() + ":", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (intHandle != INVALID_HANDLE_VALUE)
{
//清除端口 rx 和tx 缓冲器
intResult = PurgeComm(intHandle, PURGE_RXCLEAR | PURGE_TXCLEAR);
//获得已存在端口的定义
intResult = GetCommState(intHandle, out lpDCB);
//设置必要的端口定义
lpDCB.fBinary = 1; //二进制模式,没有文件结束的检校
lpDCB.fParity = 1; // 启动奇偶检校
lpDCB.fOutxCtsFlow = 0; // 没有 CTS 输出流控制
lpDCB.fOutxDsrFlow = 0; // 没有 DSR 输出流控制
lpDCB.fDtrControl = 1; // DTR 流控制类型
lpDCB.fDsrSensitivity = 0; // DSR 感应
lpDCB.fTXContinueOnXoff = 1;
lpDCB.fOutX = 0; // 没有 XON/XOFF 输出流控制
lpDCB.fInX = 0; // 没有 XON/XOFF 输入流控制
lpDCB.fErrorChar = 0; // 关闭错误替换
lpDCB.fNull = 0; // 关闭 null 拆卸
lpDCB.fRtsControl = 1; // RTS 流控制
lpDCB.fAbortOnError = 0; // 不中止读写异常错误
lpDCB.StopBits = stopbits; // 0, 1, 2 = 1, 1.5, 2
lpDCB.ByteSize = databits;
lpDCB.Parity = parity; // 0-4 = no, odd, even, mark, space
lpDCB.BaudRate = baudrate;
lpDCB.XonChar = '1';
intResult = SetCommState(intHandle, ref lpDCB);
//设置端口缓冲区大小(单位为字节)
intResult = SetupComm(intHandle, rxbuffersize, txbuffersize);
//设置端口超时值(单位为毫秒)
lpCommTimeouts.ReadIntervalTimeout = 0;
lpCommTimeouts.ReadTotalTimeoutMultiplier = 0;
lpCommTimeouts.ReadTotalTimeoutconstant = timeout;
lpCommTimeouts.WriteTotalTimeoutMultiplier = 10;
lpCommTimeouts.WriteTotalTimeoutconstant = 100;
//intResult = SetCommTimeouts(intHandle, lpCommTimeouts);
}
else
{
intHandle = INVALID_HANDLE_VALUE;
}
}
else
{
intHandle = INVALID_HANDLE_VALUE;
}
return intHandle;
}
#endregion
#region "Close"
private int Close(int handle)
{
int intResult;
if (handle != INVALID_HANDLE_VALUE)
{
intResult = CloseHandle(handle);
if (intResult < 0)
{
throw new Exception("不能关闭端口!");
}
}
return INVALID_HANDLE_VALUE;
}
#endregion
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -