当时搜了很久,没咋都到合适的思路,就自己整理一份吧
大致实现的功能:
通过串口接收数据,进行解析,然后显示,或者保存数据;
主要:多个串口接收显示都能用;
大致思路:
1、新建一个类SerialPortOP
public SerialPortOP(变量)
{
执行的内容
}
2、类里面可以包括打开关闭串口、委托、串口接收事件Datareceive(或者新开一个线程,用于数据接收解析)并调用委托
3、在Form程序里面
SerialPortOP spop =new SerialPortOP(变量);
就可以实现新开一个串口了 多new几次就是多个串口
4、委托的使用:通过在Form程序中
(委托函数)+=(显示函数)
(委托函数)+=(保存函数)
来进行数据保存和显示 可以比较好的区分开每个串口对应的数据
5、自我感觉这是一个线程完成一个串口功能,如果你是画图之类的功能,建议多开一个线程来显示。
注:本人半路出家,很多定义,名词表述可能有问题,还望批评指正
实现案例:(只包含大致内容,具体功能自行修改)
class内容
public class SerialPortOP
{
//委托
//数据显示委托
public delegate void UpdateSpData(SpData spdata,int comportname);
public UpdateSpData UpdateSpDataDelegate;
//数据保存委托
public delegate void SaveSpData(SpData spdata, int comportname);
public SaveSpData SaveSpDataDelegate;
public SerialPort comm;
bool _keepReading = false;
public Thread threadReceive;
/// <summary>
/// 实例化
/// </summary>
/// <param name="commIn">串口号</param>
/// /// <param name="comportIn">串口名字</param>
public SerialPortOP(Config configIn, SerialPort commIn,int comportIn)
{
_keepReading = false;
comm = commIn;
ComPortName = comportIn;
//开启接收数据线程
ReceiveData(comm);
}
public void ThreadClose()
{
_keepReading = false;
//关闭线程
if (threadReceive != null)
{
threadReceive.Abort();
threadReceive.Join();
}
}
~SerialPortOP()
{
_keepReading = false;
if (threadReceive != null)
{
threadReceive.Abort();
threadReceive.Join();
}
}
/// <summary>
/// 开启数据接收线程
/// </summary>
/// <param name="serialPort">串口号</param>
private void ReceiveData(SerialPort serialPort)
{
_keepReading = true;
threadReceive = new Thread(new ParameterizedThreadStart(SynReceiveData));
threadReceive.IsBackground = true;
threadReceive.Start(serialPort);
}
/// <summary>
/// 数据接收线程
/// </summary>
/// <param name="serialPortobj">串口号</param>
private void SynReceiveData(object serialPortobj)
{
SerialPort serialPort = (SerialPort)serialPortobj;
System.Threading.Thread.Sleep(0);
serialPort.ReadTimeout = 0;// 1000;
while (_keepReading)
{
内容.......
委托:
UpdateSpDataDelegate(_spdata,ComPortName);
SaveSpDataDelegate(_spdata, ComPortName);
}
}
}
Form里面调用class以及委托
public SerialPortOP[] SerialPortOPes { get; set; } = new SerialPortOP[10]; //串口通信类
public SerialPort[] SerialPorts { get; set; } = new SerialPort[10]; //建立的serialport
.......
......
....
//开一个
SerialPortOP spclass= new SerialPortOP(SerialPorts[0], 1);
SerialPortOPes[0] = spclass;
SerialPortOPes[0].UpdateSpDataDelegate += ShowSpDataToTextBox;
//开两个
SerialPortOP spclass= new SerialPortOP(SerialPorts[1], 2);
SerialPortOPes[1] = spclass;
SerialPortOPes[1].UpdateSpDataDelegate += ShowSpDataToTextBox;
//显示的大概思路
private void ShowSpDataToTextBox(SpData spdataIn, int comportnameIn)
{
textBoxes[comportnameIn - 1][0].Text = spdataIn.xgyr.ToString("F6");
textBoxes[comportnameIn - 1][1].Text = spdataIn.ygyr.ToString("F6");
textBoxes[comportnameIn - 1][2].Text = spdataIn.zgyr.ToString("F6");
textBoxes[comportnameIn - 1][3].Text = spdataIn.xa_temp.ToString("F6");
textBoxes[comportnameIn - 1][4].Text = spdataIn.xa_temp.ToString("F6");
textBoxes[comportnameIn - 1][5].Text = spdataIn.xa_temp.ToString("F6");
textBoxes[comportnameIn - 1][6].Text = spdataIn.allcounter.ToString("D");
}