C#串口通讯
串口通讯和之前网络通讯一样,首先确定需要使用到的参数,然后声名成一个对象
public class BDSerialPortParam
{
/// <summary>
/// 串口号
/// </summary>
public string portName { get; set; }
/// <summary>
/// 波特率
/// </summary>
public int baudRate { get; set; }
/// <summary>
/// 数据位
/// </summary>
public int dataBits { get; set; }
/// <summary>
/// 校验位
/// </summary>
public Parity parity { get; set; }
/// <summary>
/// 停止位
/// </summary>
public StopBits stopBits { get; set; }
}
接着声名串口类,进行连接
此串口使用的是modbus通讯 buffer[]数组是需要发送的指令,其中0X01是设备站号,0X03是功能码,0X44和0X0C是CRC校验码,可通过文档给的方法计算出来,具体可以查看相应的说明书会有详细的说明。
public class BD4320SerialPort
{
public static SerialPort Serial;
/// <summary>
/// 用于存储5个通道得温度
/// </summary>
double[] TemperatureList = new double[5];
/// <summary>
/// 发送给bd的字节数组
/// </summary>
byte[] buffer = new byte[8];
/// <summary>
/// 判断BD4320E是否连接
/// </summary>
public bool IsConnection = true;
/// <summary>
/// 初始化串口
/// </summary>
/// <returns>执行结果</returns>
private bool InitialSerialPort( BDSerialPortParam mySerial)
{
if (Serial == null)
{
Serial = new SerialPort();
Serial.PortName = mySerial.portName;
Serial.BaudRate = mySerial.baudRate;
Serial.DataBits = mySerial.dataBits;
Serial.Parity = mySerial.parity;
Serial.StopBits = mySerial.stopBits;
buffer[0] = 0X01;
buffer[1] = 0X03;
buffer[2] = 0X00;
buffer[3] = 0X00;
buffer[4] = 0X00;
buffer[5] = 0X08;
buffer[6] = 0X44;
buffer[7] = 0X0C;
}
else
{
Serial.Open();
return true;
}
try
{
Serial.ReadTimeout = 1000;
Serial.WriteTimeout = 500;
Serial.Open();
Serial.DtrEnable = true;
Serial.RtsEnable = false;
return true;
}
catch (Exception ex)
{
return false;
}
}
/// <summary>
/// 写入并读取
/// </summary>
public double[] WriteAndRead(ref string msg)
{
try
{
msg = "";
for (int i = 0; i < TemperatureList.Length; i++)
{
TemperatureList[i] = 999.9;
}
Serial.Write(buffer, 0, buffer.Length);
Thread.Sleep(60);
int n = Serial.BytesToRead;
byte[] receivebBuffer = new byte[n];
Serial.Read(receivebBuffer, 0, n);
//返回前3个字节是头报文 ((receivebBuffer[i] << 8) | receivebBuffer[i + 1])
/*
* 比如03E8H(100.0℃);
* 03=00000000 00000011 左移八位00000011 00000000
* E8=00000000 11101000 |
* 得到0000001111101000=1000 /10.0则得到我们实际想要的值
*/
for (int i = 3, j = 0; i + 2 < receivebBuffer.Length && j < 5; i = i + 2, j++)
{
TemperatureList[j] = ((receivebBuffer[i] << 8) | receivebBuffer[i + 1]) / 10.0;
}
IsConnection = true;
return TemperatureList;
}
catch (Exception ex)
{
IsConnection = false;
msg = ex.Message;
return TemperatureList;
}
}
/// <summary>
/// 关闭串口资源
/// </summary>
/// <param name="strMessage">消息</param>
/// <returns></returns>
public bool ClosePort(ref string strMessage)
{
try
{
if (Serial == null)
{
strMessage = "串口未实例化!";
return true;
}
if (Serial.IsOpen)
{
Serial.Close();
if (Serial.IsOpen == false)
{
strMessage = "串口成功关闭!";
return true;
}
else
{
strMessage = "串口关闭失败!";
return false;
}
}
else
{
strMessage = "串口未打开!";
return true;
}
}
catch (Exception ex)
{
strMessage = ex.Message;
Serial.Dispose();
return false;
}
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="mySerial"></param>
public BD4320SerialPort(BDSerialPortParam mySerial)
{
InitialSerialPort(mySerial);
}
}