通过串口RS232和工控机连接,工控机可以接收设备(光电传感器)的IO信号

SerialPortSwitch portSwitch = new SerialPortSwitch("COM3");
ToolData.WriteLog(lrtxtLog, "打开" + cbcomname3.Text + "成功", 0);
portSwitch.SwitchOn += pin =>
{//断开到闭合事件触发,CD、CTS、DSR之间任意一个触发都会进入该事件,可以在类中进行设置
};
portSwitch.SwitchOff += pin =>
{//从闭合到断开事件触发
};
portSwitch.Start();

原理是软件后台线程一直发信号检测port.CDHolding以及port.DsrHolding和port.CtsHolding这三个的状态,如果状态变化则进入到事件

SerialPortSwitch类

/********************************************* -------------* \ 1 2 3 4 5 /*  \ 6 7 8 9 /*   --------- * 原理:* 4[DTR]作为+6V电源 也可以用[RTS]替代[DTR]* 软件中不停检测* 1[CD ]* 6[DSR]* 8[CTS]* 三个端口的电压变化*********************************************/using System;
using System.IO.Ports;
using System.Threading;namespace TrainDemo
{/// <summary>/// /// </summary>public delegate void SwitchEventHandler(Pin pin);/// <summary>/// 用一个串口采集3路开关输入信号(也叫钢节点或继电器输入)/// </summary>public class SerialPortSwitch{private const int PRIORITY = 20;/// <summary>/// 瞬时信号过滤时间/// </summary>private const int FILTER = 40;private readonly SerialPort port = new SerialPort();private readonly PinState[] pins;public event SwitchEventHandler SwitchOn;public event SwitchEventHandler SwitchOff;public bool IsRunning { get; private set; }public bool StopPedding { get; private set; }public SerialPortSwitch(string portName){this.port.PortName = portName;this.port.BaudRate = 9600;this.port.Parity = Parity.None;this.port.DataBits = 8;this.port.StopBits = StopBits.Two;this.port.ReadBufferSize = 8;this.port.WriteBufferSize = 8;this.port.DtrEnable = true;this.port.RtsEnable = true;this.port.Handshake = Handshake.RequestToSend;pins = new[]//如果不需要全部信号都接收,可以在这里操作{new PinState {PinName = Pin.CD},new PinState {PinName = Pin.CTS},new PinState {PinName = Pin.DSR},};}public void Start(){if (IsRunning) return;IsRunning = true;StopPedding = false;try{Thread thread = new Thread(OnRunning);thread.Name = "SerialPortSwitch";thread.Start();}catch{IsRunning = false;StopPedding = false;throw;}}public void Stop(bool waitUntilStoped = true){if (IsRunning) StopPedding = true;if (waitUntilStoped){int timeout = Environment.TickCount + 10 * 1000;while (Environment.TickCount < timeout){Thread.Sleep(100);if (IsRunning == false) return;}throw new TimeoutException("Stop SerialPortSwitch failed");}}private void OnRunning(){try{port.Open();while (StopPedding == false){foreach (PinState pin in pins){CheckState(pin);}Thread.Sleep(PRIORITY);}}catch (Exception ex){//TODO:log error.System.Diagnostics.Debug.WriteLine("SerialPortSwitch term:" + ex);}finally{IsRunning = false;StopPedding = false;}}private void CheckState(PinState pin){bool newHoding = GetPinHoding(pin.PinName);if (pin.IsHoding == newHoding){pin.HodingStableTime = Environment.TickCount;}if (Environment.TickCount - pin.HodingStableTime > FILTER){pin.IsHoding = newHoding;if (pin.IsHoding){if (SwitchOn != null) SwitchOn(pin.PinName);}else{if (SwitchOff != null) SwitchOff(pin.PinName);}}}private bool GetPinHoding(Pin pin){switch (pin){case Pin.CD:return port.CDHolding;case Pin.DSR:return port.DsrHolding;case Pin.CTS:return port.CtsHolding;default:throw new ArgumentOutOfRangeException();}}}/// <summary>/// 串口中的3个信号针/// </summary>public enum Pin{CD = 1,DSR = 6,CTS = 8,}public class PinState{public Pin PinName { get; set; }public bool IsHoding { get; set; }public int HodingStableTime { get; set; }}
}

C#接收串口RS232的CD、CTS、DSR信号相关推荐

  1. java 串口 dtr rts_串口(RS232 RS485等)通讯中RTS/CTS,DTR/DSR的含义详解

    串口(RS232 RS485等)通讯中RTS/CTS,DTR/DSR的含义详解 先贴出缩写的含义: DTR – Data Terminal Ready DSR – Data Set Ready RTS ...

  2. 【整理】串口(RS232/RS485等)通讯中RTS/CTS,DTR/DSR的含义详解

    [整理]串口(RS232/RS485等)通讯中RTS/CTS,DTR/DSR的含义详解 RS232 crifan 7年前 (2013-10-17) 14942浏览 0评论 [背景] 之前就折腾过很多关 ...

  3. 串口流控(CTS/RTS)使用详解

    1.流控概念 在两个设备正常通信时,由于处理速度不同,就存在这样一个问题,有的快,有的慢,在某些情况下,就可能导致丢失数据的情况. 如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的 ...

  4. 通过JAVA与串口(RS232)通信实例

    通过JAVA与串口(RS232)通信实例 博客分类: J2SE JavaVBthread  最近了解到的需求是需要需激光打刻机进行(RS232)串口通信,  这里使用的是RXTX开源包实现的.  之前 ...

  5. 串口RS232/485/UART转CANbus总线转换器网关CSM100模块CANCOM

    串口RS232/485/UART转CANbus总线转换器网关CSM100模块CANCOM CANUART-100T系列智能双向UART转CAN模块具有一路TTL UART串口通道和一路CAN通道,实现 ...

  6. 串口RS232 RS485最本质的区别!-!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议!

    5分钟看懂!串口RS232 RS485最本质的区别!-4分钟看懂!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议,5分钟看懂! 一.5分钟看懂!串口RS232 RS485最本质的区别! 二 ...

  7. 串口/RS232/RS485 简解

    前言 首先归一下类(借鉴网友的说法,还可深入了解): UART SPI IIC 这些是一类,一般只规定了高低电平的逻辑. RS232 RS485 RS422这些属于一类,规定了电平的电压范围,数据逻辑 ...

  8. serialport接收串口数据_C#串口操作类,包括串口读写操作

    串口进行操作的类,其中包括写和读操作,类可设置串口参数.设置接收函数.打开串口资源.关闭串口资源,操作完成后,一定要关闭串口.接收串口数据事件.接收数据出错事件.获取当前全部串口.把字节型转换成十六进 ...

  9. java swing 串口_ComTest 接收串口数据,并显示在文本框内,通过JavaSwing实现 Develop 265万源代码下载- www.pudn.com...

    文件名称: ComTest下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 3157 KB 上传时间: 2016-09-21 下载次数: 0 提 供 者: 韩坤 ...

最新文章

  1. 阿铭每日一题 day 6 20180116
  2. 避免打断链式结构:使用.compose( )操作符
  3. Python写入到csv文件存在空行的解决方法
  4. python使用pyodbc,freetds连接azure数据库
  5. python urllib3离线安装_全球Python库下载前10名
  6. python性能解决_Python性能优化的20条建议
  7. c语言删除文件第一行_ElasticSearch 文档的删除和批量操作
  8. 网络延长器分为哪几类?其应用领域有哪些?
  9. 小程序 canvas 设置 字体 字号加粗
  10. [go]---从java到go(01)---基础与入门上手
  11. 2021抖音电商达人生态报告
  12. kafka 丢弃数据_Kafka史上最详细原理总结下
  13. 2011年骑行爬山成绩记录
  14. 批量修改windows 用户密码
  15. Windows安全描述符SECURITY_DESCRIPTOR阅读注释
  16. 计算机文化基础多选题答案,计算机基础多选题集(附答案)
  17. Java 的守护线程是什么情况?
  18. Python解决买五赠二问题
  19. indoor是什么意思_indoor是什么意思
  20. FFplay文档解读-45-视频过滤器二十

热门文章

  1. Elasticsearch 5
  2. Magento中如何在模块中使用多张数据表并配置多个model?
  3. JQuery Autocomplete实战
  4. java Servlet学习笔记
  5. ffmpeg frei0r filter 参数及效果
  6. 虚函数表指针,虚函数表
  7. Redmine+Apache+SVN+Postfix完整配置指南
  8. 服务器安全设置之--硬盘权限篇
  9. 6月第1周回顾:华为再现猝死 中国成全球最大宽带市场
  10. 如何支持亿级用户分流实验?AB实验平台在爱奇艺的实践