【问题标题】:Automatically toggle RTS line (Delphi Prism SerialPort)自动切换 RTS 线(Delphi Prism SerialPort)
【发布时间】:2011-10-09 16:09:17
【问题描述】:

我在 Delphi Prism 下使用 SerialPort。我能够将字节发送到串口,但我无法从外部接收数据,因为 SerialPort 请求发送 (RTS) 线总是高或高。那么,你设置了什么设置来自动切换 RTS 行?

这是我设置的串口属性:

SerialPort1 := new System.Io.Ports.SerialPort();
SerialPort1.BaudRate:=19200;
SerialPort1.DataBits:=8;
SerialPort1.DtrEnable:=true;
SerialPort1.Parity:=System.IO.Ports.Parity.Even;
SerialPort1.PortName:='COM1';//'/dev/ttyS0';
SerialPort1.ReadBufferSize:=3000;
SerialPort1.ReadTimeout:=1000;
SerialPort1.ReceivedBytesThreshold:=1;
SerialPort1.RtsEnable:=true;
SerialPort1.StopBits:=System.IO.Ports.StopBits.One;
SerialPort1.WriteTimeout:=1000;
SerialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(@MySerialData);
SerialPort1.Open;

我确实设置了 DTR。请求发送线是您控制何时读取和写入串行数据的方式。 RTS 高则只能写入,RTS 低则只能读取。我们检查了示波器上的通信线,RTS 线一直是高电平,这意味着我们的程序只能发送字节,而不能从外部读取任何字节或数据。这就是 DataReceived 事件永远不会执行的主要原因,因为它永远不会看到任何传入的字节或数据。

那么,在查看了我的串口设置之后,你能告诉我我缺少什么吗?

【问题讨论】:

    标签: serial-port toggle delphi-prism-2010


    【解决方案1】:

    RTS 是输出,所以它与接收没有任何关系。尝试开启 DTR 和/或 CTS。

    编辑:

    尝试删除启用 RTS 的行并为 RTS/CTS 添加握手(不确定在 Delphi 中究竟是什么)。我知道别针的用途和它们应该做什么。你有显示这是如何接线的引脚排列吗?我假设 2 和 3 是交叉的,DTR 到 DSR 两个方向,RTS 到 CTS 两个方向。

    【讨论】:

    • 对于握手,我只有 4 个不同的内置选项可供选择 - None、RequestToSend、RequestToSendXonXoff 和 XonXoff。但是,如果我选择除了 None 用于握手选项之外的任何一个,无论我将 writeTimeout 属性设置为什么,serialport.Write 例程都会一直超时。因此,我在写入过程之前和之后手动设置和重置 RTS。它似乎有效,但只有在将 RTS 设置为低之前我必须有一个 NoOp 循环才能获得读取数据的精确时间。或者所有传入或响应字节都丢失了。
    • 现在,我的 DataReceived 事件正在触发,因为它看到了传入的字节。
    • @digit 我不了解 Delphi,但在 .Net RequestToSend 中,握手似乎会在有数据要发送时自动提高 RTS。对不起,如果我让你感到困惑。如果您手动执行此操作,请提高 RTS,等待 CTS,然后发送。
    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多