C#中如何通过RS232读取引脚传输的高低电平信号
RS232引脚电平读取问题解答
核心结论先给
- 标准RS232(DB9接口)除了硬件流控相关引脚外,没有额外的通用GPIO引脚可供读取高低电平。
- 你说的裸高低电平触发信号,不属于RS232标准串行数据传输场景,但属于工程上非常常见的非标准用法,完全可行,不存在“非法”一说。
- 这类开关量信号只会接到RS232的4个输入状态引脚上,不会接到RX/TX数据引脚。
引脚对应关系
DB9公头接口下,可被上位机读取电平状态的输入引脚共4个,也是这类开关量传感器最常接的引脚:
- 引脚1:CD(载波检测),对应C#中
SerialPort.CDHolding属性 - 引脚6:DSR(数据设备就绪),对应C#中
SerialPort.DsrHolding属性 - 引脚8:CTS(清除发送),对应C#中
SerialPort.CtsHolding属性 - 引脚9:RI(振铃指示),无直接对应属性,可通过
PinChanged事件捕获跳变
注意:RX(引脚2,接收数据)、TX(引脚3,发送数据)是唯一用于传输串行编码数据的引脚,如果传感器接的是这两个脚,它一定会输出符合RS232帧格式的串行数据,不可能是裸高低电平信号,必须通过串口读数据的方式获取触发信息。
排查&实现步骤
- 先确认传感器接线类型
用万用表直流电压档,在传感器触发/未触发两种状态下,测量RS232接口各引脚电压:- 如果1/6/8/9引脚在两种状态下存在+3V+15V(逻辑0)和-3V-15V(逻辑1)的跳变,说明是接的状态引脚,直接监听引脚变化即可
- 如果只有引脚2存在规律电平跳变,说明是标准RS232串口传感器,需要找厂商要通信协议,匹配波特率、数据位、校验位参数后,通过
Read方法读取数据帧判断触发状态
- C#读取引脚状态的实现
不需要走串口数据读取逻辑,直接绑定PinChanged事件即可,示例代码如下:// 初始化串口,波特率等参数如果不读数据可以随便填,只要能打开串口就行 SerialPort motionPort = new SerialPort("COM3") { BaudRate = 9600, Parity = Parity.None, DataBits = 8, StopBits = StopBits.One }; motionPort.PinChanged += (s, e) => { bool isTriggered; switch (e.EventType) { case SerialPinChange.CDChanged: isTriggered = motionPort.CDHolding; // 处理CD引脚触发逻辑 break; case SerialPinChange.CtsChanged: isTriggered = motionPort.CtsHolding; // 处理CTS引脚触发逻辑 break; case SerialPinChange.DsrChanged: isTriggered = motionPort.DsrHolding; // 处理DSR引脚触发逻辑 break; case SerialPinChange.Ring: // 处理RI引脚触发逻辑 break; } }; motionPort.Open(); - 注意事项
这种非标准接法不要热插拔串口,接线前先确认传感器输出电平范围,不要把超过RS232电平范围的电压直接接到串口引脚上,避免烧坏硬件。
内容的提问来源于stack exchange,提问作者CorrieJanse
相关产品推荐
相关产品推荐

