我正在尝试使用RS485 2线进行双向通信,到目前为止我尝试的所有内容都失败了。
我可以发送数据并让我的外围设备按预期反应(所以接线是正确的),但我从未收到任何回复。
我正在使用.NET SerialPort
,我尝试使用DataReceived
事件以及Thread
轮询端口的循环。我甚至试图阻止读取,直到收到足够的数据。
我尝试了几种硬件选择:
我玩过驱动程序设置: - 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个字节长。
答案 0 :(得分:2)
我已通过以下方法修复了一个硬件配置(RS485卡)上的问题:
我的发送代码现在看起来像这样:
// Enable send mode
SerialPort.DtrEnable = false;
SerialPort.Write(data, 0, data.Length);
// Wait a little, then enable response mode.
Thread.Sleep(15);
SerialPort.DtrEnable = true;