C# 中串口通信 使用的类是 SerialPort 。
创建接口信息
SerialPort sPort = new SerialPort();//实例化串口通讯类
/// <summary>
/// 打开串口信息
/// </summary>
/// <returns></returns>
private bool OpenSerialPort(string portName)
{
try
{
sPort.PortName = portName;
sPort.BaudRate = 19200;//波特率
sPort.DataBits = 8;//数据位
//sp.StopBits = (StopBits)(0);//停止位
sPort.ReadTimeout = 500;//读取数据的超时时间,引发ReadExisting异常
if (sPort.IsOpen)
{
sPort.Close();
sPort.Open();//打开串口
}
else
{
sPort.Open();//打开串口
}
return true;
}
catch (Exception ex)
{
ShowMessage("错误:" + ex.Message, "C#串口通信");
return false;
}
}
发送设备参数
/// <summary>
/// 发送串口设备参数
/// </summary>
/// <param name="buf"></param>
/// <param name="len">必须是8位一组</param>
/// <returns></returns>
private bool SendSerialPort(byte[] buf, int len)
{
if (sPort.IsOpen)
{
try
{
sPort.Write(buf, 0, len);//发送数据
return true;
}
catch (Exception ex)
{
ShowMessage("发送串口通信失败:" + ex.Message);
return false;
}
}
else
{
ShowMessage("请先打开串口!");
return false;
}
}
接收串口信息
byte[] getBuf = new byte[10];
while (true)
{
Thread.Sleep(10);//等待执行时间
try
{
if (sPort.BytesToRead > 0) //此方式等待数据返回结果,比较合适,使用异常方式不稳定
{
getBuf[0] = 0;
sPort.Read(getBuf, 0,10);
if (getBuf.Length != 0)
{
///执行内容
}
}
}
catch (Exception ex)
{
ShowMessage("接收数据失败:" + ex.Message);
ResetState();
return;
}
}
使用心得:
最好不要使用超时异常作为正常的程序流程的一部分,实际操作中这种方式会存在很大弊端,使用BytesToRead 方式更合理,对于设备操作也更稳定。