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