zoukankan      html  css  js  c++  java
  • 操作串口通信类(IO.Ports)SerialPort

      公司项目接近尾部,从刚开始接触SerialPort到现在,用的最多算是它了。所以,现在做个总结。

      刚开始接到这个项目的时候,就从没接触过SerialPort,不知道如何下手,像最基本的PortName(通信端口)、BaudRate(波特率)、Parity(奇偶校验)、DataBits(数据位长度)、StopBits(停止位数)都不知道,后来网上google别人的经验,知道了最基本的用法,原来串口通信还需要下层的同事把协议写好,烧到硬件上去。

      串口的使用:

      1,串口控件位于 工具箱—组件—SerialPort, 拖动到窗体上,设置属性(Name),命名。


     

      

      

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

      可在属性处进行设置,也可以在后台代码页进行手动写:

      需导入命名空间:using System.IO.Ports;

            /// <summary>
    /// 串行端口资源 端口名称 波特率 奇偶校验位 数据位 停止位
    /// </summary>
    public SerialPort port = new SerialPort("COM1", 115200, Parity.None, 8, StopBits.One);

      

      设置好串行端口等属性之后,便可以操作串口进行通信了,如要对设备进行全部开启操作。

            /// <summary>
    /// //设备全开、关
    /// </summary>
    protected void AllOpenOrClose()
    {
    try
    {
    //打开串口
    port.Open();
    //判断是否选中开
    if (chb_CheckAll.Checked == true)
    {
    //用字节的形式发送数据 全开 解释:order1 是控制命令,后面是2个byte的校验(高8位与低8位),0x00可以不写,直接写成(byte)((order1)>>8)
    byte[] b = { order1, (byte)((order1 + 0x00) >> 8), (byte)(order1 + 0x00) };
                //把b数组中的数据以字节的形式写入串行端口
    port.Write(b, 0, b.Length);
                //提示信息!
    lab_Message.Text = "设备已经全部打开!";
    }
    else
    {
    //用字节的形式发送数据 全关
    byte[] b = { order2, (byte)((order2 + 0x00) >> 8), (byte)(order2 + 0x00) };
    v.port.Write(b, 0, b.Length);
    lab_Message.Text = "设备已经全部关闭!";
    }

    //关闭串口 记得开启端口之后一定要关闭,和ADO.NET的Connection对象一样,用过之后必须关闭。
    port.Close();
    }
    catch (Exception ex)
    {
             //捕获的异常信息
    MessageBox.Show(ex.Message, "提示");

    }
    }

     

      2,如果要对设备的状态进行实时监听,有一个很好的事件,在SerialPort类中有DataReceived事件,当串口的读缓存有数据到达时则触发DataReceived事件,其中 SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为 1。

      我们把串口的属性定义在InitializeComponent()方法下面,(不会连这个方法都不知道把?!!)。在页面命名空间下的第一个方法,是Visual Studio设计器自动生成的方法。

            public SettingsTimePlay()
    {
    InitializeComponent();
    //串行端口号
    seriaSettingPlay.PortName = "COM1";
    //波特率
    seriaSettingPlay.BaudRate = 115200;
    //奇偶校验位
    seriaSettingPlay.Parity = Parity.None;
    //数据位
    seriaSettingPlay.DataBits = 8;
    //停止位
    seriaSettingPlay.StopBits = StopBits.One;
           textChanged += new UpdateTextEventHandler(ChangeText);
    try
    {
    //打开串口
    seriaSettingPlay.Open();
    }
    catch (Exception ex)
    {
    //捕获的异常信息,没检查到串口或串口设置不正确。
    MessageBox.Show("请检查是否已经连接串口!\n" + ex.Message, "提示");
    }
    }

      

      属性定义完成之后,需要,

     

            //定义委托
    private delegate void GetText(string text);
    //定义事件
    private event GetText textChanged;
    //事件处理方法
    private void ChangeText(string text)
    {
    //这里为处理接收到的值,赋值到控件上。
    ...........
    }

      

      现在就是DataReceived事件进行实时监听了,

      

    
    
    //定义接收的字节
    private byte[] Data = new byte[8];
    private
    void seriaSettingPlay_DataReceived(object sender, SerialDataReceivedEventArgs e)

      //读取来自监听到的字节
      seriaSettingPlay.Read(be,0,be.Length);
      //把第一个命名赋值到text变量
      text=be[0].Tostring();
      seriaSettingPlay.DiscardInBuffer();
      this.Invoke(textChanged, new string[] { text});

      最后,记得在Load事件里去读取。还有取出来的数据最好也进行校验,因为不校验容易受到干扰。

      希望对大家学习串口知识有所帮助。

  • 相关阅读:
    元组,字典
    for循环补充,变量和不可变量,数字类型,字符串类型,列表类型
    流程控制之while循环,for循环
    运算符,流程控制之if判断
    变量,常量,基本数据类型、运算符
    蓝桥杯--算法提高 排列数 (简单dfs)
    蓝桥杯-- 历届试题 核桃的数量 (gcd)
    hdoj--1272--小希的迷宫(并查集)
    zzulioj--1769--去师院的旅程:能怎么走(三)(0.0)
    zzulioj--1638--Happy Thanksgiving Day
  • 原文地址:https://www.cnblogs.com/aehoo/p/FirstArticle.html
Copyright © 2011-2022 走看看