zoukankan      html  css  js  c++  java
  • .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);
        }
    }
  • 相关阅读:
    BW中变量增强学习
    视频压制参数设置详细说明(转)
    swf文件格式解析(二)
    关于FP10.2的自定义鼠标功能
    swf文件格式解析(一)
    如何判断winform程序已安装过
    flashbuilder4.5 作为eclipse插件
    安装程序无法创建新的系统分区,也无法定位现有系统分区 (转载于百度文库)
    【转】VS2008建造打包法度将安装路径写入注册表
    【高清视频压制教程】使用MeGUI压制视频教程(以PSP视频为例)(转载)
  • 原文地址:https://www.cnblogs.com/zpehome/p/2838671.html
Copyright © 2011-2022 走看看