zoukankan      html  css  js  c++  java
  • Visual studio之C# 串口通讯SerialPort

    背景

    App需要串口进行通讯,在此做个记录和简要说明。

    正文

    1. 添加命名空间
    using System.IO.Ports;
    
    1. 实例化串口
    SerialPort serialPortO = new SerialPort();
    
    1. 设置SerialPort参数
    // 获取当前所有的COM口讯息
    String[] serialPort1Array = SerialPort.GetPortNames();
    if (serialPort1Array != null && serialPort1Array.Length != 0)
    {
            // 对串口进行排序
            Array.Sort<String>(serialPort1Array);
            // 选择首个串口
            serialPortO.PortName = serialPort1Array[0];
            // 波特率 9600
            serialPortIn.BaudRate = 9600;        
            // 数据位为 8 位
            serialPortO.DataBits = 8;
            // 停止位为 1 位
            serialPortO.StopBits = StopBits.One;
            // 无奇偶校验位
            serialPortO.Parity = Parity.None;
            // 读取串口超时时间为1000ms
            serialPortO.ReadTimeout = 1000;
    }
    
    1. 打开串口
    if(serialPortO.IsOpen)
    {
            serialPortO.Close();
    }
    try
    {
            serialPortO.Open();
    }
    catch (Exception ex)
    {    // 捕捉异常
            Console.Write(ex);
    }
    
    1. 往串口写入数据
    if((serialPortO != null) && (serialPortO.IsOpen))
    {
            byte[] buf = new byte[2];
            buf[0] = 0x01;
            buf[1] = 0x02;
            
            try
            {
                // 参数1:发送数据的缓存位置
                // 参数2:缓存数据位置的偏移值
                // 参数3:发送数据字节大小
                serialPortO.Write(buf, 0, 2);
            }
            catch (Exception ex)
            {    // 捕捉异常
                Console.Write(ex);
            }
    }
    
    1. 从串口读数据
      SerialPort类有一个数据接收事件,可如下注册数据接收事件,
    //serialPortIn_DataReceived便是数据接收事件处理函数
    serialPortIn.DataReceived += serialPortIn_DataReceived;
    

    参考MSDN文档SerialPort.DataReceived EventDataReceived事件的描述,当接收到eof字符时,就算没有达到ReceivedByteThreshold的阈值条件,DataReceived事件也会产生,并且DataReceived事件并不能保证每次都能在接收条件均符合时能准确的产生DataReceived事件,由此可见,在DataReceived事件处理函数中,不能直接处理接收到的数据,因为有可能没有接收完全,因此在该事件函数中应该只可对数据进行压栈处理,然后另外开一个线程出栈并处理这些数据才更为稳妥。

    //读函数如下
    if((serialPortO != null) && (serialPortO.IsOpen))
    {
            byte[] revbuf = new byte[2];
            
            try
            {
                // 参数1:读取数据的缓存位置
                // 参数2:缓存读取据位置的偏移值
                // 参数3:读取数据字节大小
                serialPortO.Read(revbuf, 0, 2);
            }
            catch (Exception ex)
            {    // 捕捉异常
                Console.Write(ex);
            }
    }
    

    至此记录完毕。

    参考链接

    记录时间:2017-5-9
    记录地点:深圳WZ

  • 相关阅读:
    分布式集群环境下运行Wordcount程序
    VM搭建hadoop分布式集群
    安装运行Hadoop
    网络问题
    Golang依赖工具
    会话进程组终端 · 守护进程
    Golang笔记
    [转]GDB
    [转]用户态与内核态
    【转】linux环境内存分配原理 malloc info
  • 原文地址:https://www.cnblogs.com/ChYQ/p/6829608.html
Copyright © 2011-2022 走看看