首页 文章

如何在.NET中实现RS485 2线双向通信?

提问于
浏览
1

我正在尝试使用RS485 2线进行双向通信,到目前为止我尝试的所有内容都失败了 .

我可以发送数据并让我的外围设备按预期做出反应(所以接线是正确的),但我从未收到任何回复 .


我正在使用.NET SerialPort ,我尝试使用 DataReceived 事件,并在 Thread 轮询端口中进行循环 . 我甚至试图阻止读取,直到收到足够的数据 .


我尝试了几种硬件选择:

  • 带有Sena RS232-RS485转换器的PCI RS232卡

  • 带有Moxa RS232-RS485转换器的PCI RS232卡

  • 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个字节长 .

1 回答

  • 2

    我通过以下方式修复了一个硬件配置(RS485卡)的问题:

    • 固定接线:虽然它是's called ' 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;
    

相关问题