我正在尝试使用RS485 2线进行双向通信,到目前为止,我尝试过的一切都失败了。
我可以发送数据,并让我的周边反应如预期(因此接线是正确的),但我从来没有收到任何答复。
我正在使用.NET SerialPort
,我尝试使用DataReceived
事件,并在Thread
中使用一个循环轮询端口。我甚至尝试过阻止读,直到收到足够的数据。
我尝试过几种硬件选择:
我玩过驱动程序设置:
按照各种引线(如Can't receive serial data in .net 2.0, using rs232 to rs485 converter),我尝试将DtrEnable
设置为true,或false,或将其切换。
我还尝试过在发送和接收时切换RtsEnable
(跟随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字节长。
发布于 2013-09-06 14:06:20
我已经通过以下方法将这个问题固定在一个硬件配置( 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;
https://stackoverflow.com/questions/18614477
复制相似问题