C#接收串口RS232的CD、CTS、DSR信号
通过串口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信号相关推荐
- java 串口 dtr rts_串口(RS232 RS485等)通讯中RTS/CTS,DTR/DSR的含义详解
串口(RS232 RS485等)通讯中RTS/CTS,DTR/DSR的含义详解 先贴出缩写的含义: DTR – Data Terminal Ready DSR – Data Set Ready RTS ...
- 【整理】串口(RS232/RS485等)通讯中RTS/CTS,DTR/DSR的含义详解
[整理]串口(RS232/RS485等)通讯中RTS/CTS,DTR/DSR的含义详解 RS232 crifan 7年前 (2013-10-17) 14942浏览 0评论 [背景] 之前就折腾过很多关 ...
- 串口流控(CTS/RTS)使用详解
1.流控概念 在两个设备正常通信时,由于处理速度不同,就存在这样一个问题,有的快,有的慢,在某些情况下,就可能导致丢失数据的情况. 如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的 ...
- 通过JAVA与串口(RS232)通信实例
通过JAVA与串口(RS232)通信实例 博客分类: J2SE JavaVBthread 最近了解到的需求是需要需激光打刻机进行(RS232)串口通信, 这里使用的是RXTX开源包实现的. 之前 ...
- 串口RS232/485/UART转CANbus总线转换器网关CSM100模块CANCOM
串口RS232/485/UART转CANbus总线转换器网关CSM100模块CANCOM CANUART-100T系列智能双向UART转CAN模块具有一路TTL UART串口通道和一路CAN通道,实现 ...
- 串口RS232 RS485最本质的区别!-!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议!
5分钟看懂!串口RS232 RS485最本质的区别!-4分钟看懂!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议,5分钟看懂! 一.5分钟看懂!串口RS232 RS485最本质的区别! 二 ...
- 串口/RS232/RS485 简解
前言 首先归一下类(借鉴网友的说法,还可深入了解): UART SPI IIC 这些是一类,一般只规定了高低电平的逻辑. RS232 RS485 RS422这些属于一类,规定了电平的电压范围,数据逻辑 ...
- serialport接收串口数据_C#串口操作类,包括串口读写操作
串口进行操作的类,其中包括写和读操作,类可设置串口参数.设置接收函数.打开串口资源.关闭串口资源,操作完成后,一定要关闭串口.接收串口数据事件.接收数据出错事件.获取当前全部串口.把字节型转换成十六进 ...
- java swing 串口_ComTest 接收串口数据,并显示在文本框内,通过JavaSwing实现 Develop 265万源代码下载- www.pudn.com...
文件名称: ComTest下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 3157 KB 上传时间: 2016-09-21 下载次数: 0 提 供 者: 韩坤 ...
最新文章
- 阿铭每日一题 day 6 20180116
- 避免打断链式结构:使用.compose( )操作符
- Python写入到csv文件存在空行的解决方法
- python使用pyodbc,freetds连接azure数据库
- python urllib3离线安装_全球Python库下载前10名
- python性能解决_Python性能优化的20条建议
- c语言删除文件第一行_ElasticSearch 文档的删除和批量操作
- 网络延长器分为哪几类?其应用领域有哪些?
- 小程序 canvas 设置 字体 字号加粗
- [go]---从java到go(01)---基础与入门上手
- 2021抖音电商达人生态报告
- kafka 丢弃数据_Kafka史上最详细原理总结下
- 2011年骑行爬山成绩记录
- 批量修改windows 用户密码
- Windows安全描述符SECURITY_DESCRIPTOR阅读注释
- 计算机文化基础多选题答案,计算机基础多选题集(附答案)
- Java 的守护线程是什么情况?
- Python解决买五赠二问题
- indoor是什么意思_indoor是什么意思
- FFplay文档解读-45-视频过滤器二十