zoukankan      html  css  js  c++  java
  • 物联网架构成长之路(37)-基于C#开发串口工具

    0. 前言
      作为物联网平台开发,最基础的工具链还是要有的。前几篇博客,介绍了用C#开发一个MQTT的客户端,用于模拟设备连接平台,并发送数据到平台。但是对于一些硬件来说,可能会用到串口uart来发送数据。然后经过模块,转换为JSON再通过MQTT发往平台。这个适合需要开发一些工具来协助开发。平台固然重要,但是对应的工具链也是比较重要的。


    1. 创建虚拟串口
      要做一个串口工具,为了方便调试,我们需要安装一个虚拟串口软件。模拟两个串口,然后用标准的串口工具来发送数据,自己开发的工具用来接收数据。
      http://www.greenxf.com/soft/213933.html 可以在这里下载破解版。
      先安装第二个原版。然后用第一个打开。

      打开后,创建虚拟串口


    2. C#串口编程
      效果图(本工具,不开源,不给代码):

    3. 参考代码

      1        #region 模块串口功能
      2 
      3         private void btnSerialModulRefresh_Click(object sender, EventArgs e)
      4         {
      5             string[] names = SerialPort.GetPortNames();
      6             if(names == null || names.Length <= 0)
      7             {
      8                 MessageBox.Show("未找到串口COM 可以在这里下载虚拟串口工具: http://www.greenxf.com/soft/213933.html");
      9                 return;
     10             }
     11             cbbSerialModulCOM.Items.Clear();
     12             cbbSerialModulCOM.Items.AddRange(names);
     13             cbbSerialModulCOM.SelectedItem = names[0];
     14         }
     15 
     16         private void btnSerialModulOpen_Click(object sender, EventArgs e)
     17         {
     18             try
     19             {
     20                 if (serialModulPort.IsOpen)
     21                 {
     22                     //串口处于打开状态
     23                     serialModulPort.Close();
     24                     btnSerialModulOpen.Text = "●打开串口";
     25                     btnSerialModulOpen.ForeColor = Color.Red;
     26                     txtSerialModulRecv.Text = "";
     27 
     28                     cbbSerialModulCOM.Enabled = true;
     29                     cbbSerialModulDataBits.Enabled = true;
     30                     cbbSerialModulParity.Enabled = true;
     31                     cbbSerialModulRate.Enabled = true;
     32                     cbbSerialModulStopBits.Enabled = true;
     33                 }
     34                 else
     35                 {
     36                     if (string.IsNullOrEmpty(cbbSerialModulCOM.Text))
     37                     {
     38                         MessageBox.Show("串口COM不能为空");
     39                         return;
     40                     }
     41 
     42                     //串口处于关闭状态,需要设置好属性后打开
     43                     cbbSerialModulCOM.Enabled = false;
     44                     cbbSerialModulDataBits.Enabled = false;
     45                     cbbSerialModulParity.Enabled = false;
     46                     cbbSerialModulRate.Enabled = false;
     47                     cbbSerialModulStopBits.Enabled = false;
     48 
     49                     serialModulPort.PortName = cbbSerialModulCOM.Text;
     50                     serialModulPort.BaudRate = Convert.ToInt32(cbbSerialModulRate.Text);
     51                     serialModulPort.DataBits = Convert.ToInt16(cbbSerialModulDataBits.Text);
     52 
     53                     string parity = cbbSerialModulParity.Text;
     54                     if (parity.Equals("None"))
     55                     {
     56                         serialModulPort.Parity = Parity.None;
     57                     }else if (parity.Equals("Odd"))
     58                     {
     59                         serialModulPort.Parity = Parity.Odd;
     60                     }else if (parity.Equals("Even"))
     61                     {
     62                         serialModulPort.Parity = Parity.Even;
     63                     }else if (parity.Equals("Mark"))
     64                     {
     65                         serialModulPort.Parity = Parity.Mark;
     66                     }else if (parity.Equals("Space"))
     67                     {
     68                         serialModulPort.Parity = Parity.Space;
     69                     }
     70 
     71                     string stopbit = cbbSerialModulStopBits.Text;
     72                     if (stopbit.Equals("1"))
     73                     {
     74                         serialModulPort.StopBits = StopBits.One;
     75                     }else if (stopbit.Equals("1.5"))
     76                     {
     77                         serialModulPort.StopBits = StopBits.OnePointFive;
     78                     }else if (stopbit.Equals("2"))
     79                     {
     80                         serialModulPort.StopBits = StopBits.Two;
     81                     }
     82 
     83                     serialModulPort.Open();
     84                     btnSerialModulOpen.Text = "●关闭串口";
     85                     btnSerialModulOpen.ForeColor = Color.Blue;
     86                 }
     87             }catch(Exception ex)
     88             {
     89                 serialModulPort = new SerialPort();
     90                 btnSerialModulOpen.Text = "●打开串口";
     91                 btnSerialModulOpen.ForeColor = Color.Red;
     92                 txtSerialModulRecv.Text = "";
     93 
     94                 cbbSerialModulCOM.Enabled = true;
     95                 cbbSerialModulDataBits.Enabled = true;
     96                 cbbSerialModulParity.Enabled = true;
     97                 cbbSerialModulRate.Enabled = true;
     98                 cbbSerialModulStopBits.Enabled = true;
     99                 //出现可能的错误
    100                 MessageBox.Show(ex.Message);
    101             }
    102         }
    103 
    104         private void btnSerialModulPortSend_Click(object sender, EventArgs e)
    105         {
    106             try
    107             {
    108                 if (serialModulPort.IsOpen)
    109                 {
    110                     string data = txtSerialModulSend.Text.Replace(" ", "");
    111                     if (string.IsNullOrEmpty(data))
    112                     {
    113                         MessageBox.Show("请先在发送区填写发送数据(十六进制)");
    114                         return;
    115                     }
    116                     byte[] bytes = HexStrTobyte(data);
    117                     serialModulPort.Write(bytes, 0, bytes.Length);
    118                 }
    119                 else
    120                 {
    121                     MessageBox.Show("请先打开串口COM");
    122                 }
    123             }catch(Exception ex)
    124             {
    125                 serialModulPort = new SerialPort();
    126                 btnSerialModulOpen.Text = "●打开串口";
    127                 btnSerialModulOpen.ForeColor = Color.Red;
    128                 txtSerialModulRecv.Text = "";
    129 
    130                 cbbSerialModulCOM.Enabled = true;
    131                 cbbSerialModulDataBits.Enabled = true;
    132                 cbbSerialModulParity.Enabled = true;
    133                 cbbSerialModulRate.Enabled = true;
    134                 cbbSerialModulStopBits.Enabled = true;
    135                 //出现可能的错误
    136                 MessageBox.Show(ex.Message);
    137             }
    138         }
    139 
    140         private void serialModulPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    141         {
    142             Console.WriteLine("收到数据");
    143             try
    144             {
    145                 //因为要访问UI资源,所以需要使用invoke方式同步ui
    146                 Invoke((EventHandler)(delegate{
    147                     txtSerialModulRecv.Text = "";
    148                     int size = serialModulPort.BytesToRead;
    149                     string buf = "";
    150                     for(int i=0; i<size; i++)
    151                     {
    152                         byte c = (byte)serialModulPort.ReadByte();
    153                         buf += ByteToHexString(c) + " ";
    154                     }
    155                     txtSerialModulRecv.Text = buf;
    156                 }));
    157             }
    158             catch (Exception ex)
    159             {
    160                 //响铃并显示异常给用户
    161                 System.Media.SystemSounds.Beep.Play();
    162                 MessageBox.Show(ex.Message);
    163             }
    164         }
    165 
    166         private void btnSerialModulPortClearRecv_Click(object sender, EventArgs e)
    167         {
    168             txtSerialModulRecv.Text = "";
    169         }
    170         #endregion

    参考文章:
      https://www.cnblogs.com/liaocheng/p/9144317.html

    本文地址: https://www.cnblogs.com/wunaozai/p/11665404.html

  • 相关阅读:
    【leetcode】1295. Find Numbers with Even Number of Digits
    【leetcode】427. Construct Quad Tree
    【leetcode】1240. Tiling a Rectangle with the Fewest Squares
    【leetcode】1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold
    【leetcode】1291. Sequential Digits
    【leetcode】1290. Convert Binary Number in a Linked List to Integer
    【leetcode】1269. Number of Ways to Stay in the Same Place After Some Steps
    【leetcode】1289. Minimum Falling Path Sum II
    【leetcode】1288. Remove Covered Intervals
    【leetcode】1287. Element Appearing More Than 25% In Sorted Array
  • 原文地址:https://www.cnblogs.com/wunaozai/p/11665404.html
Copyright © 2011-2022 走看看