这几天要做产线的一个治具,需要用到串口,这里就研究了下。
挺简单的,都是静态函数,直接调用即可
这个类能够实现串口的同步读和异步读方法
不要放在UI线程,会导致阻塞的。可以使用backgroundworker
需要using System.IO.Ports;
public class SerialPortHelp
{
//测试串口状态
public static bool Test(SerialPort serialport)
{
try
{
serialport.Open();
serialport.Close();
return true;
}
catch (Exception)
{
return false;
}
}
//函数会直接发送一串字符串
static public bool Send(string data,SerialPort serialport)
{
try
{
serialport.Write(data);
return true;
}
catch (Exception)
{
return false;
}
}
//发送二进制
static public bool SendBinary(byte[] data, SerialPort serialport)
{
try
{
serialport.Write(data, 0, data.Length);
return true;
}
catch (Exception)
{
return false;
}
}
//同步读 直到超时
static public string SynRead(int TimeoutMs, SerialPort serialport)
{
string data;
serialport.ReadTimeout = TimeoutMs;
try
{
//阻塞到读取数据或超时
byte firstByte = Convert.ToByte(serialport.ReadByte());
int bytesRead = serialport.BytesToRead;
byte[] bytesData = new byte[bytesRead + 1];
bytesData[0] = firstByte;
for (int i = 1; i <= bytesRead; i++)
bytesData[i] = Convert.ToByte(serialport.ReadByte());
data = System.Text.Encoding.Default.GetString(bytesData);
return data;
}
catch (Exception)
{
return string.Empty;
//处理超时错误
}
}
//异步读
static public string AsyRead(int waitTimeMs, SerialPort serialport)
{
string data;
System.Threading.Thread.Sleep(waitTimeMs);
try
{
data = serialport.ReadExisting();
return data;
}
catch (Exception)
{
return string.Empty;
//处理错误
}
}
}