多串口接收数据并显示-自定义串口通信类-调用委托显示数据-保存数据-实例:10串口接收数据并显示加保存

当时搜了很久,没咋都到合适的思路,就自己整理一份吧

大致实现的功能:

通过串口接收数据,进行解析,然后显示,或者保存数据;

主要:多个串口接收显示都能用;

大致思路:

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");
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值