串口对于工控领域应用较为广泛,串口通讯类型主要分为RS-232,RS-485。

RS-232 也称标准串口,最常用的一种串行通讯接口。目前常用为9芯D型插座(DB9),在两台电脑之间通讯需要用到D行头的端子(2、3、5),分别为读、写、信号地。在两台电脑通讯时需要对信号端子2和3进行对调,一端的写“端子3”对应另一端的读“端子2”,信号地端子直连即可,接线图如下。

目前,大部分的笔记本已经不在配置RS-232物理串口,如何在计算机进行串口程序调试,就需要用到vspd虚拟串口软件,用这个软件可以在电脑上虚拟出来串口,虚拟出的可以1对1进行绑定。

此软件可以添加、删除、重置端口,上图已经增加了3对串口,COM1~COM2,COM3~COM4,COM5~COM6,可以相互通讯,这样就能在笔记本上进行串口程序的调试,工具VSPD6.9.zip-网络设备文档类资源-CSDN下载。

下面进行C# SerialPort介绍

1、BaudRate:波特率,两个串口之间通讯,需要两端的波特率设置一致,否则,数据接收会出现乱码,如果波特率不同,串口也能接收到数据,知识分析内容不一致;波特率越高,传输距离就越短,当波特率为115200时,保证数据完整,需要线长小于10m,如果线距过大会造成误码的情况,传输效率会降低。

2、PortName:串口名称,在windows计算机下,串口的命名都是以COM开头,串口1则为COM1,以此类推,串口10即为COM10,由于C#加Mono,可使C#程序运行在Linux主机上,SerialPort控件时支持跨平台的,但是在linux下,串口命名/dev/ttyS0,即填写对应名称在PortName上即可,此属性string类型。

3、IsOpen:是否打开,通过此属性进行串口打开的判断。

4、BytesToRead:串口读缓冲中的字节数,通过此属性判断是否有数据。

5、Close()方法:用来关闭串口,当程序退出时,需要对串口进行关闭。

6、Open()方法:用来打开串口,当串口打开时,即可进行数据发送和接收。

7、Write()方法:用来写串口数据,传输数据使用byte[]数组和长度。

8、Read()方法:用BytesToRead的长度从读缓冲区中读取数据到byte[]数组中,当执行Read()方法后,缓冲区数据同时清空。

下面对SerialPort控件进行封装,对发送数据增加头、尾、校验,防止传输过程中数据丢失,代码见下图。

    public class SerialPortClass{/// <summary>/// 串口组件/// </summary>private SerialPort serialPort = new SerialPort();/// <summary>/// 是否启动线程/// </summary>private bool IsStart = false;/// <summary>/// 数据列表/// </summary>public List<byte> DataList = new List<byte>();/// <summary>/// 缓冲区列表/// </summary>private List<byte> buffer = new List<byte>();/// <summary>/// 串口名称/// </summary>public string PortName = "COM1";/// <summary>/// 初始化/// </summary>/// <param name="_portname"></param>public SerialPortClass(){try{ReadParam();serialPort.Close();serialPort.PortName = PortName;serialPort.BaudRate = 9600;}catch (Exception ex){LogHelper.Debug(ex);}}public void ReadParam(){try{PortName = ConfigurationManager.AppSettings["PortName"];}catch (Exception ex){LogHelper.Debug(ex);}}/// <summary>/// 打开串口/// </summary>/// <returns></returns>public bool OpenCom(){bool Ret = false;try{CloseCom();if (!serialPort.IsOpen){serialPort.Open();DataList.Clear();Ret = true;}}catch (Exception ex){LogHelper.Debug(ex);}return Ret;}/// <summary>/// 关闭串口/// </summary>public void CloseCom(){try{serialPort.Close();}catch (Exception ex){LogHelper.Debug(ex);}}/// <summary>/// 启动任务/// </summary>public void StartTask(){try{IsStart = true;Thread task = new Thread(new ThreadStart(Run));task.IsBackground = true;task.Start();}catch (Exception ex){LogHelper.Debug(ex);}}/// <summary>/// 停止任务/// </summary>public void StopTask(){try{IsStart = false;}catch (Exception ex){LogHelper.Debug(ex);}}/// <summary>/// 读取数据/// </summary>private void Run(){while (true){if (!IsStart) break;try{if (serialPort.IsOpen){int count = serialPort.BytesToRead;if (count > 0){byte[] buf = new byte[count];serialPort.Read(buf, 0, count);buffer.AddRange(buf);while (buffer.Count >= 2){if (buffer[0] == 0x02) //帧头{int len = buffer[1]; //长度if (buffer.Count < len + 4)     //完整数据为帧长+4   头1 长度1 命令 校验1 尾1{                               //                   02    01   A     X  03break;}byte sum = 0;for (int i = 1; i < len + 2; i++) //校验{sum += buffer[i];}if (buffer[len + 3] == 0x03 && buffer[len + 2] == sum){if (DataList.IndexOf(buffer[len + 1]) < 0)DataList.Add(buffer[len + 1]);}buffer.RemoveRange(0, len + 4);}else{buffer.RemoveAt(0);}}}}}catch (Exception ex){LogHelper.Debug(ex);}Thread.Sleep(10);}}public void SendBuff(byte _order){try{if (serialPort.IsOpen){byte[] buff = new byte[5];buff[0] = 0x02;buff[1] = 0x01;buff[2] = _order;byte sum = buff[1];sum += buff[2];buff[3] = sum;buff[4] = 0x03;serialPort.Write(buff, 0, buff.Length);}}catch (Exception ex){LogHelper.Debug(ex);}}}

C# 串口SerialPort控件相关推荐

  1. 串口MSComm控件五种不同校验方式对数据收发的影响

    (2008-09-10 14:50:00)   http://blog.sina.com.cn/s/blog_470eccc60100arq7.html   串口MSComm控件有五种校验方式,分别是 ...

  2. VS2010中MSCOMM 串口通信控件的注册使用

    VS2010本身并不自带MSCOMM控件,因此在Win7.win8/8.1系统中使用VS2010进行串口编程时, 在COM控件一栏中没法找到. 网上解决这个问题的文章很多,但尝试了很多种方法都没有解决 ...

  3. 用VC开发串口通信dll控件

    VC串口通信技术网<VC串口上位机编程方法简介>介绍了串口编程的常见方法,其中就有使用串口dll控件的方法,dll是一种动态链接库,使用起来非常方便. 本文利用VC编程工具,对Window ...

  4. SPCOMM控件在Delphi7.0串口通信中的应用

    ====================================================== 注:本文源代码点此下载 ================================= ...

  5. delphi7 如何加载控件

    1.delphi7 如何加载Fastnet控件 在CSDN中搜索了半天,都说Fastnet控件没有办法加载,要么安装delphi6.0 要么用indy,这种说法只能说明,回帖的人没有能够领会,提出问题 ...

  6. DELPHI下基于APRO控件的语音系统开发

    开始设计 下面我们就来看看如何利用这组控件实现语音功能,对于我们程序的应用来说,只需要使用两个 TAPI 控件 TApdComPort 和 TApdTapiDevice 即可,其中 TApdComPo ...

  7. VS2008下用MFC 的MSComm控件编写串口程序

    可以在:http://download.csdn.net/detail/plutus_lee/4525446 下载详细文档. 首先感谢网络资源吧,作为一个自动化专业出身的,不懂串口实在让我有点无奈,本 ...

  8. VC基于MSCOMM控件串口通讯

    在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem). 还可以发送命 ...

  9. BCB 串口控件的使用 TComm

    昨天工作用到了串口通信,MMP的,昨天懵逼了一下午,今天终于整通了,身为菜鸟,大师们是不懂这些心痛的. 进入主题:使用BCB提供的控件TComm编程方便且简单,TComm位于System分类里面.   ...

最新文章

  1. c++ 构造函数析构函数 数据安全_C++知识点 16:构造函数和析构函数的语法
  2. Leetcode 1 Two Sum
  3. PHP培训教程 PHP里10个鲜为人知但却非常有用的函数
  4. Eclipse常用快捷
  5. 多线程系列之学习多线程下载的基本原理和基本用法(1)
  6. 统计信息自动收集任务失效原因排查
  7. C#使用Microsoft.ACE.OLEDB.12.0 需要安装的组件
  8. IAR #pragma optimize 指令
  9. Android Studio 使用笔记:工具窗口浮动与布局恢复
  10. glibc静态链接 libc.a(nsswitch.o)(.data+0x64):undefined reference to `_nss_files_getaliasent_r' 错误解决方法
  11. python生成密码字典
  12. 简单的STM32汇编程序
  13. SC7A20 三轴加速度传感器 驱动
  14. 「Android高级工程师」BAT大厂面试基础题集合-下 Github标星6.5K
  15. iOS 创建 pch 文件
  16. python发朋友圈突破朋友圈限制_突破限制!原来朋友圈可以发长达5分钟的视频,后悔没早点知道...
  17. 什么是前端渲染和后端渲染和SPA页面
  18. Gitlab与Jaeger集成,实现Tracing链路追踪
  19. python一句代码生成26个英文字母
  20. dell 720 raid 配置

热门文章

  1. win10编译tensorflow C++接口
  2. C/C++八大排序(c/c++)
  3. FACTS与STATCOM(灵活交流输电系统与静止同步补偿器)
  4. 成长,不断破局 | 1024程序员节特别企划
  5. 一句代码将OpenCV的Mat对象的数据打印输出
  6. 【电源设计】09磁芯元件在开关电源中的应用
  7. storm 分布式的实时计算系统
  8. UVA 1438 - Asteroids(三维凸包)
  9. 2018最新《物业管理条例》全文
  10. 什么是NFS?NFS挂载