class SerialPortComm
{
static SerialPort serialPort;
public static void SetupSerialPort()
{
serialPort = new SerialPort("COM10");
// 设定波特率
serialPort.BaudRate = 9600;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Parity = Parity.None;
serialPort.Handshake = Handshake.RequestToSend;
serialPort.ReadTimeout = 3000; // 读超时设置
serialPort.WriteTimeout = 3000; // 写超时设置
serialPort.Open();
}
public static void SendAndReceiveData()
{
try
{
// 良好习惯性清空缓冲区
serialPort.DiscardInBuffer();
serialPort.DiscardOutBuffer();
string toSend = "Hello;";
serialPort.Write(toSend);
// 接收数据
string receivedData = ReadData(';');
System.Windows.Forms.MessageBox.Show("接收数据:" + receivedData);
}
catch (TimeoutException ex)
{
System.Windows.Forms.MessageBox.Show("超时异常:" + ex.Message);
}
catch (System.IO.IOException ioe)
{
Console.WriteLine("IO 异常: " + ioe.Message);
}
finally
{
//关闭串口
serialPort.Close();
}
}
// 读取数据,直到遇到特定的终止符
public static string ReadData(char delimiter)
{
string incomingData = "";
char ch;
while ((ch = (char)serialPort.ReadChar()) != delimiter)
{
incomingData += ch;
}
return incomingData;
}
// 多线程处理例子
//并发处理:这使得主线程能够继续执行而不被阻塞,
//从而实现并发执行。在串口通信场景中,特别是需要持续监听串口数据的情况下,
//通过将接收数据的逻辑放在一个后台线程上执行,可以避免阻塞主线程的工作。
public static void StartListening()
{
Thread readThread = new Thread(new ThreadStart(SendAndReceiveData));
readThread.Start();
}
// 主函数
static void Main()
{
SetupSerialPort();
StartListening();
//心跳
Timer heartBeatTimer = new Timer(SendHeartBeat, null, 0, 3000);
Thread.Sleep(Timeout.Infinite); // 防止主线程退出
}
public static void SendHeartBeat(Object stateInfo)
{
if (serialPort.IsOpen)
{
serialPort.WriteLine("HeartBeat");
}
}
}
串口通信类的编写
最新推荐文章于 2024-08-09 11:35:57 发布