导入命名空间
using System.IO.Ports; //串口类 SerialPort 属于该命名空间
string[] portStr = SerialPort.GetPortNames(); //搜索当前设备下的串口
//该方法为串口类的静态方法,调用方法 类名+函数名
类实例与参数初始化
public SerialPort sp = new SerialPort();
DataBits:读写 每个字节的标准数据位长度。 数据位值是小于 5 或大于 8。[DefaultValue(8)]
IsOpen :只读 如果串行端口已打开,则为 true;否则为 false。 默认值为 false。
DsrHolding :只读 如果“数据设置就绪”信号已发送到端口,则为 true;否则为 false。
ReadBufferSize :读写 缓冲区大小(以字节为单位)。 默认值为 4096;最大值为正整数,即 2147483647。
ParityReplace :获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节。 返回结果: 替换无效字节的字节。
PortName : 摘要: 获取或设置通信端口,包括但不限于所有可用的 COM 端口。
// 返回结果: 通信端口。 默认值为 COM1。
ReadTimeout:获取或设置 读取操作未完成时发生超时之前的毫秒数。读取操作可能因为其他进程被阻塞而超时
ReceivedBytesThreshold : 获取或设置 System.IO.Ports.SerialPort.DataReceived 事件发生前内部输入缓冲区中的字节数,可以控制输入缓存的初始位置。
RtsEnable :在485单双工通讯时用于控制RTS。
StopBits :枚举 定义停止位 StopBits.None
WriteBufferSize : 获取或设置串行端口输出缓冲区的大小。 默认值为 2048。
WriteTimeout : 获取或设置写入操作未完成时发生超时之前的毫秒数。写到端口超时
Parity : 获取或设置奇偶校验检查协议。Parity.None;
BytesToRead : 获取接收缓冲区中数据的字节数。
BaudRate :获取或设置串行波特率。
BytesToWrite :获取发送缓冲区中数据的字节数。
更详细介绍需要自己去看 SerialPort 类中的注释了
初始化:
public void PortInit(string serialName, Int32 iBaudRate, Int32 iDateBits, StopBits sbit, Parity parity)
{
//串口名
sp.PortName = serialName;
//波特率
sp.BaudRate = iBaudRate;
//数据位
sp.DataBits = iDateBits;
sp.StopBits = sbit;
sp.Parity = parity;
/*
comReg.t_byte_us = 1000000 / sp.BaudRate * 11;
comReg.rxStart = 0;
comReg.RxIndex = 0;
*/
//准备就绪
sp.DtrEnable = true;
sp.RtsEnable = true;
//设置数据读取超时为1秒
sp.ReadTimeout = 80;
sp.ReceivedBytesThreshold = 1;
}
打开、接收、发送与关闭
打开
public void OpenPort()
{
try
{
sp.Open();
}
catch (Exception e)
{
return;
}
}
接收
public class SerialPortService
{
public SerialPort sp = new SerialPort();
public SerialPortService()
{
sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);
//在构造函数中注册一个处理接收事件的函数
}
/*接收函数*/
void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (sp.IsOpen == false) return;
int dataLength = sp.BytesToRead; //看一下收到多少字节
if (dataLength <= 0) return;
Byte[] receivedData = new Byte[dataLength];
//读取数据
sp.Read(receivedData, 0, receivedData.Length);//放到二级缓存中
//1.缓存数据
buffer.AddRange(receivedData);
DateBuf.PushDateBuf(buffer, dataLength);//按照自己定义的协议再处理一下
buffer.RemoveRange(0, dataLength);//
}
}
发送:
public void TxData(byte[] byteBuffer, int length)
{
if (sp.IsOpen == false)
{
return;
}
try
{
sp.Write(byteBuffer, 0, length);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
关闭:
public void ClosePort()
{
sp.Close();
}