我正在尝试使用 RS485 2 线进行双向通信,到目前为止我尝试过的一切都失败了。
我可以发送数据并让我的外围设备按预期做出反应(因此接线正确),但我从未收到任何回复。
我正在使用 .NET SerialPort
,我尝试使用DataReceived
事件以及Thread
轮询端口中的循环。我什至尝试阻止读取,直到收到足够的数据。
我尝试了几种硬件选项:
- 带有 Sena RS232-RS485 转换器的 PCI RS232 卡
- PCI RS232 卡带 Moxa RS232-RS485 转换器
- PCI RS485 卡
我玩过驱动程序设置: - FIFO 中断触发级别 - 接收器 FIFO 流控制阈值 - RS485 缓冲区启用(正常、高电平有效、低电平有效)
遵循各种线索(例如Can't receive serial data in .net 2.0, using rs232 to rs485 converter),我尝试设置DtrEnable
为 true、false 或切换它。
我也尝试RtsEnable
在发送和接收时进行切换(按照http://en.wikipedia.org/wiki/RS-232#RTS.2FCTS_handshaking)。
如果不求助于不同的接线,我现在没有其他可以尝试的方法。有什么问题?
根据要求,一些代码(它只是多次尝试后的快照):
打开:
_serialPort = new SerialPort(comboBoxSerialPort.Text, 9600, Parity.None, 8, StopBits.One)
{
WriteTimeout = 500,
ReadTimeout = 500,
Handshake = Handshake.None
};
_serialPort.Open();
_serialPort.DtrEnable = true;
_serialPort.RtsEnable = true;
发送:
_serialPort.RtsEnable = false;
_serialPort.Write(data, 0, data.Length);
_serialPort.RtsEnable = true;
Thread.Sleep(1);
_dataSent.Set();
读者线程:
var port = form1._serialPort;
byte[] buffer = new byte[128];
int read = 0;
do
{
Array.Clear(buffer, 0, buffer.Length);
read = 0;
try
{
form1._dataSent.WaitOne();
//if (port.BytesToRead > 0)
read = port.Read(buffer, 0, buffer.Length);
}
catch (TimeoutException)
{
}
catch (Exception ex)
{
form1.Invoke(form1.AddErrorMethod, ex.ToString());
continue;
}
if (read > 0)
{
form1.Invoke(form1.AddOutputMethod, ByteListToString(buffer));
}
Thread.Sleep(20);
}
while (_continue);
注意:数据包长 10 个字节,双向。