• .NET写串口调试软件


    在工作中写过很多串口调试软件,大部分都用于生产测试用。

    创建串口实例:

    SerialPort serialPort = new SerialPort();

    在窗体加载时注册串口接收事件:

    private void FrmMain_Load(object sender,EventArgs e)
    {
        InitBandRate();//初始化波特率
        InitPortName();//初始化串口号
        serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);//注册串口接收事件
    } 

    接收函数:

    private bool closeing = false;
    private bool listening = false;//这两个变量是为了防止在串口接收数据时关闭串口会出现假死状态
    void serialPort_DataReceived(object sender,SerialDataReceivedEventArgs e)
    {
        try
        {
            if(closeing)
            {
                return;
            }
            listening = true;
            byte[] data_buff = new byte[serialPort.BytesToRead];//serialPort.BytesToRead的大小代表当前串口缓冲区的大小,并且它的值是异步变化的
            int count = serialPort.Read(data_buff,0,data_buff.Length);
            if(count>0)
            {
                 //to do 在这里显示数据,在现实数据时,会提示跨线程的异常,解决办法可以关闭跨异常检测,或者用委托,一般用委托
            }
        }
        catch(Exception ex)
        {
            MessageBox(ex.Message);
        }
        finally
        {
            listening = false;
        }
    }

    串口号初始化函数:

    private void InitPortName()
    {
        string[] strPortName = SerialPort.GetPortNames();
        cbxPortName.Items.AddRange(strPortName);//将串口号添加大checkbox控件
    }

    注册cbxPortName控件的DropDown事件,当下来cbxPortName时重新获得串口号:

    private void cbxPortName_DropDown(object sender,EventArgs e)
    {
        cbxPortName.Items.Clear();
        string[] strPortName = SerialPort.GetPortName();
        cbxPortName.Items.AddRange(strPortName);
    }

    打开串口/关闭串口:

    private btnOpenClose_Click(object sender,EventArgs e)
    {
        if(!serialPort.IsOpen)
        {
            serialPort.PortName = cbxPortName.Text;
            serialPort.BandRate = Convert.ToInt32(cbxBandRate.Text);
            serialPort.Open();
            btnOpenClose.Text = "关闭串口";
        }
        else
        {
            closeing = true;
            while(listening)Application.DoEvent();
            serialPort.Close();
            closeing = false;
            btnOpenClose.Text = "打开串口";
        }
    }

    委托:

    private delegate void SetText(TextBox tb,string str);
    
    private void SetAppendTB(TextBox tb,string str)
    {
        if(tb.InvokeRequired)
        {
            SetText setText = new SetText(SetAppendTB);
            Invoke(setText,new object[] {tb,str}); 
        }
        else
        {
            tb.AppendText(str);
        }
    }
  • 相关阅读:
    批量修改文件的名字
    字节码指令以及操作数栈的分析
    字节码文件的分析
    类加载器详解
    类的加载-连接-初始化
    电商订单ElasticSearch同步解决方案--使用logstash
    springboot整合Mangodb实现crud,高级查询,分页,排序,简单聚合
    mongodb安装教程(亲测有效)
    Azure : 通过 SendGrid 发送邮件
    用java实现删除目录
  • 原文地址:https://www.cnblogs.com/zpehome/p/2838671.html
Copyright © 2020-2023  润新知