c#处理握手RTS/CTS

c#处理握手RTS/CTS,c#,serial-port,C#,Serial Port,我有两台设备,它们通过rs232和RTS/CTS相互通信,我需要用我自己的设备和软件替换其中一台设备 我试图通过使用System.IO.Ports.SerialPort库来实现这一点,从我在线收集的数据来看,如果我们将RtsEnable属性设置为“true”,将Handshake属性设置为“RequestToSend”,那么该库将自行处理握手,但我在从设备接收数据时遇到一些问题 在测试我的软件时,我无法从设备接收任何信息,但如果我将接线更改为仅作为两个原始设备之间的嗅探器工作,我可以正确接收数据

我有两台设备,它们通过rs232和RTS/CTS相互通信,我需要用我自己的设备和软件替换其中一台设备

我试图通过使用System.IO.Ports.SerialPort库来实现这一点,从我在线收集的数据来看,如果我们将RtsEnable属性设置为“true”,将Handshake属性设置为“RequestToSend”,那么该库将自行处理握手,但我在从设备接收数据时遇到一些问题

在测试我的软件时,我无法从设备接收任何信息,但如果我将接线更改为仅作为两个原始设备之间的嗅探器工作,我可以正确接收数据。据我所知,我在处理握手时肯定做错了什么

以下是我正在尝试的代码:

stationPort = new SerialPort(stationPortNumber, baudRate, parity, dataBits, stopBits);
stationPort.RtsEnable = true;
stationPort.Handshake = Handshake.RequestToSend;
stationPort.DataReceived += StationPort_DataReceived;
stationPort.Open();

private static void StationPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    byte[] bytes = new byte[20];
    stationPort.Read(bytes, 0, stationPort.BytesToRead);
    string hexConvert = BitConverter.ToString(bytes);
    Console.WriteLine("Station OUT >>> " + hexConvert);
}
我还仔细检查了接线,以确保其正确连接,并更换了转换器,因为有时这些接线不正确,所以我选择了更可靠的MOXA UPort 1150

话虽如此,我的问题是我的实现有什么错?
我应该做更多的工作来保证握手吗?

可能的话,您使用的设备可能是半双工的

在这种情况下,为了与C#的SerialPort类通信,有必要将
握手设置为
None
,并通过应用程序本身控制RTS信号的开/关。
SerialPort类API没有该函数。

使用Win32API的通信功能时,可以通过在
DCB
中将
fRtsControl
标志设置为
RTS\u CONTROL\u TOGGLE
来实现通信

RTS控制切换0x03
指定如果有字节可供传输,RTS线路将为高电平。发送所有缓冲字节后,RTS线路将处于低位

在任何情况下,您都需要检查设备的通信规范。
但是,即使您不确定,也最好在C#中尝试一下上面的控件


您也可以尝试@baddack的评论。
如所注意到的,DTR信号(另一方的DSR)接通的事实可以是确定通信是可能的基础

与此相关,信号线是否交叉连接

TxD/RxD、RTS/CTS、DTR/DSR是否相互交叉连接?

同时检查您的设备需要如何使用这些规格。

是否启用了
SerialPort.DtrEnable
?我会先试试。一些软件使用DTR线路进行握手(流量控制),将其设置为高,以表示它已准备好接收数据。然而,一些仪器在提供数据之前需要DTR低,RTS高。