花名/ID: 天析

邮箱: 2200475850@qq.com

主攻方向: 物联网安全、WEB安全

兴趣爱好: 乒乓球、羽毛球、排球、业余无线电···

备案信息:蜀ICP备19023334号

物联网技能大赛 - C# 方向学习笔记

导语

由于笔者需要参加物联网技能大赛,赛中分三个方向,本次我选择了安卓方向的同时辅修了C#上位机方向,由于长时间没有去写过C#了,不足以达到参赛时的要求,因此重新开始学习并整理了这篇文档,本文档一直维护到比赛预选前夕,由于笔者学识浅薄,文中难免有一定的错误或疏漏,望看到本篇文章的各位师傅们予以斧正!

感谢名单

在本篇文档中,C# 基础知识部分多数引用自网络,感谢各位先辈们的精彩总结。

设备平台

本文中描述的设备均属于新大陆物联网综合应用平台 NLE-JS3033 中的设备。

必备基础知识:.NET框架(.NET Framework)

之前和我一起训练的小伙伴们当中有人问到了我什么是 .NET Framework ,其实他就是一个使用 .NET程序 运行的平台,比如我们所使用的C#C++F# 等语言其实都是基于 .NET 平台的。

CLR,又叫 通用语言运行库 ,即运行程序的环境

类库:.NET程序的工具集合

必备基础知识:什么是C#

C# 是一门 面向对象 的编程语言,我们这里主要使用的开发工具为来自微软官方的 Visual Studio ,简称 VS ,在物联网技能大赛中,C# 方向部分主要为开发Windows平台的 WPF 桌面程序。

必备基础知识:C# 代码中的一些规范和说明

  1. C#程序文件必须以 .cs 为后缀

  2. C#程序代码当中严格区分大小写

  3. 标识符 : 我们可以理解成其他语言中的变量名。标识符的命名规则如同其他语言一样,`以字母或下划线开头,由字母、数字、下划线组成。

数据类型

C# 当中的大多数数据类型其实我们已经在其他语言当中都已经见到过了,这里不做过多的介绍,截个图,意思一下完事儿。

C#当中的数据类型
C#当中的数据类型

必备基础知识:C# 当中的基本语法

变量的声明
数据类型 变量名称 = 变量值;

C#语法的基本结构

using System;
namespace HelloWorldApplication
{
   class HelloWorld
   {
      static void Main(string[] args)
      {
         /* 我的第一个 C# 程序*/
         Console.WriteLine("Hello World");
         Console.ReadKey();
      }
   }
}

输出语句

Console.Write("内容"); // 输出内容后,不换行
Console.WriteLine("内容"); // 输出内容后,换行

占位符输出

// {N},N从0开始,有多少个占位符,就有多少个数据
Console.Write("姓名:张三,年龄:18") ;
Console.Write("姓名:{0},年龄:{1}","张三",18) ;

必备基础知识:C#中的类型转换

其实类型转换在任何一门编程语言中,都存在着他的身影,在类型转换当中,分为两种,强制类型转换隐式类型转换 ,强制类型转换没有什么可说的,隐式类型转换一般都是都是由 低精度高精度 的转换,在转换的过程中,可能涉及到一个转换时精度丢失的问题。

强制类型转换语法格式: (需要强制转换的数据类型)数值

 double d = 123.4;
 f = (int)d;
  • ToBoolean: 如果可能的话,把类型转换为布尔型。
  • ToByte: 把类型转换为字节类型。
  • ToChar: 如果可能的话,把类型转换为单个 Unicode 字符类型。
  • ToDateTime: 把类型(整数或字符串类型)转换为 日期-时间 结构。
  • ToDecimal: 把浮点型或整数类型转换为十进制类型。
  • ToDouble: 把类型转换为双精度浮点型。
  • ToInt16: 把类型转换为 16 位整数类型。
  • ToInt32: 把类型转换为 32 位整数类型。
  • ToInt64: 把类型转换为 64 位整数类型。
  • ToSbyte: 把类型转换为有符号字节类型。
  • ToSingle: 把类型转换为小浮点数类型。
  • ToString: 把类型转换为字符串类型。
  • ToType: 把类型转换为指定类型。
  • ToUInt16: 把类型转换为 16 位无符号整数类型。
  • ToUInt32: 把类型转换为 32 位无符号整数类型。
  • ToUInt64: 把类型转换为 64 位无符号整数类型。

必备基础知识:C# 当中的命名空间

如同其他语言中的命名空间一样,在不同的命名空间当中,允许存在一模一样的名称,两个相同的名称,在一般情况下会因为冲突而出现报错,当我们把这两个一样的名称各自放到一个命名空间中去了之后,他们各自之间就不会冲突。

命名空间
命名空间

正如上图,命名空间就像是一个文件夹,我们使用命名空间来组织和管理C#中的类。

命名空间语法格式

namespace 命名空间名称 {
    <代码区>这里编写你的代码
}

必备基础知识:C# 当中的类

类的语法格式

class 类名称 {
    <代码区>这里编写你的代码
}

原生方法开启串口发送数据

问讯帧(依照教材“智能生产”所编写的MODBUS)

#电动推杆@收回
01 05 00 10 FF 00 8D FF

#电动推杆@推出
01 05 00 11 FF 00 DC 3F

#报警灯@关闭
01 05 00 12 00 00 6D CF

#报警灯@开启
01 05 00 12 FF 00 2C 3F

#三色灯@红灯开
01 05 00 13 FF 00 7D FF

#三色灯@红灯关
01 05 00 13 00 00 3C 0F

#三色灯@黄灯关
01 05 00 14 00 00 8D CE

#三色灯@黄灯开
01 05 00 14 FF 00 CC 3E

#三色灯@绿灯关
01 05 00 15 00 00 DC 0E

#三色灯@绿灯开
01 05 00 15 FF 00 9D FE

#照明灯@关闭
01 05 00 16 00 00 2C 0E

#照明灯@开启
01 05 00 16 FF 00 6D FE

#风扇@关闭
01 05 00 17 00 00 7D CE

#风扇@开启
01 05 00 17 FF 00 3C 3E

在项目解决方案里的项目上右键选择 “管理NuGet程序包”,搜索“Ports”关键字,添加System.IO.Ports引用。

创建 SerialPortUtils.cs 文件,编写串口相关类方法。

原生串口工具类

using System.Diagnostics;
using System.IO.Ports;

public class SerialPortUtils
{

    public static string[] GetPortNames()
    {
        return SerialPort.GetPortNames();
    }


    public static SerialPort SerialPort = null;
    public static SerialPort OpenClosePort(string comName, int baud)
    {
        //串口未打开
        if (SerialPort == null || !SerialPort.IsOpen)
        {
            SerialPort = new SerialPort();
            //串口名称
            SerialPort.PortName = comName;
            //波特率
            SerialPort.BaudRate = baud;
            //数据位
            SerialPort.DataBits = 8;
            //停止位
            SerialPort.StopBits = StopBits.One;
            //校验位
            SerialPort.Parity = Parity.None;
            //打开串口
            SerialPort.Open();
            //串口数据接收事件实现
            SerialPort.DataReceived += new SerialDataReceivedEventHandler(ReceiveData);

            return SerialPort;
        }
        //串口已经打开
        else
        {
            SerialPort.Close();
            return SerialPort;
        }
    }

    public static void ReceiveData(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort _SerialPort = (SerialPort)sender;

        int _bytesToRead = _SerialPort.BytesToRead;
        byte[] recvData = new byte[_bytesToRead];

        _SerialPort.Read(recvData, 0, _bytesToRead);

        //向控制台打印数据
        Debug.WriteLine("收到数据:" + recvData);
    }

    public static bool SendData(byte[] data)
    {
        if (SerialPort != null && SerialPort.IsOpen)
        {
            SerialPort.Write(data, 0, data.Length);
            Debug.WriteLine("发送数据:" + data);
            return true;
        }
        else
        {
            return false;
        }
    }

}

按钮点击事件的调用(开启串口20,波特率9600)

private void Button_Click(object sender, RoutedEventArgs e)
{

    SerialPortUtils.OpenClosePort("COM20", 9600);
    Byte[] cmd = { 0x01, 0x05, 0x00, 0x16, 0xFF, 0x00, 0x6D, 0xFE }; // 开启照明灯
    SerialPortUtils.SendData(cmd);

}

文章所属分类:  C# 

« 物联网技能大赛 - CC2530单片机开发方向学习笔记 物联网技能大赛-安卓方向学习笔记 »