2

我正在尝试使用 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 个字节,双向。

4

1 回答 1

3

我已通过以下方式解决了一种硬件配置(RS485 卡)的问题:

  • 固定接线:虽然它被称为“2 线”,但需要使用卡上的 4 根针/线,连接,2 根通过传输线。
  • 使用 DtrEnable 指示发送/接收
  • 在发送后启用接收模式之前等待。

我的发送代码现在如下所示:

// 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;
于 2013-09-06T14:06:20.003 回答