首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在RS485中实现.NET 2线双向通信?

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

Stack Overflow用户
提问于 2013-09-04 12:56:27
回答 1查看 8.8K关注 0票数 2

我正在尝试使用RS485 2线进行双向通信,到目前为止,我尝试过的一切都失败了。

我可以发送数据,并让我的周边反应如预期(因此接线是正确的),但我从来没有收到任何答复。

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

我尝试过几种硬件选择:

  • 带Sena 232-RS485 485转换器的PCI RS232卡
  • 带Moxa RS485 232-RS485 485转换器的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 (跟随handshaking)。

我现在看不出还有什么可以尝试的,不需要使用不同的电线。有什么不对的?

根据请求,一些代码(这只是多次尝试后的快照):

打开:

代码语言:javascript
运行
复制
_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;

发送:

代码语言:javascript
运行
复制
_serialPort.RtsEnable = false;
_serialPort.Write(data, 0, data.Length);
_serialPort.RtsEnable = true;

Thread.Sleep(1);
_dataSent.Set();

读者线索:

代码语言:javascript
运行
复制
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字节长。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-06 14:06:20

我已经通过以下方法将这个问题固定在一个硬件配置( RS485卡)上:

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

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

代码语言:javascript
运行
复制
// 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;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18614477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档