【问题标题】:RS 232 Break SignalRS 232 中断信号
【发布时间】:2019-12-06 16:55:42
【问题描述】:

我有一个 RS232 信号捕获设备。它工作得很好。

我需要一些帮助来理解这些数据。基本上我们购买它是因为我们正在处理使用串行通信的 80 年代后期机器控制器。尽管知道端口参数,但我们运气不佳。

根据我转储的数据,机器控制正在使用中断信号作为其协议的一部分。我无法使用 VB 和 MSComm 复制它。我知道切换中断信号并打开和关闭。但我不确定我应该用它做什么。我应该为我发送的每个数据字节保留它。或者发送一个字节的数据,然后切换。

我也很困惑我应该如何从控制器接收任何数据。我是否在打开中断时切换标志,然后在关闭时读取输入?

【问题讨论】:

    标签: vb6 hardware serial-port


    【解决方案1】:

    Michael Burr 对 break 工作方式的描述是准确的。通常,“中断”信号的发送时间明显长于一个字符时间。

    如今,“Break”在串行通信中很少使用,但最常见的用途是作为提供数据包同步的“廉价”方式。 “中断”可以在数据包开始之前发送,以提醒接收器有新数据包在路上(并允许它重置缓冲区等)或在数据包结束时发出信号,表示不再需要数据.它是一种“元字符”,它允许您保留数据包内容的全部 8 位或 7 位值,而不必担心如何描述数据包的开始或结束。

    要发送中断,通常您调用SetCommBreak,等待一段适当的时间(例如,在 9600 波特下大约 2 毫秒)然后调用 ClearCommBreak。当然,在此期间,您不能发送任何其他内容。

    所以,假设协议要求在数据包的开头“中断”,我会这样做(抱歉伪代码):-

    procedure SendPacket(CommPort port, Packet packet)
    {
        SetCommBreak(port)
        Sleep(2);  // 2 milliseconds - assuming 9600 baud. Pro-rata for others
        ClearCommBreak(port)
    
        foreach(char in packet)
            SendChar(port, char)
    }
    

    接收器的伪代码更加困难,因为您必须对传入数据包格式和用于接收中断的 API 调用做出大量假设。这次我将用 C 语言编写,并假设存在一个虚函数。 WaitCommEvent 可能是处理传入中断的关键。

    bool ReadCharOrBreak(char *ch); // return TRUE if break, FALSE if ch contains received char
    

    我们还将假设固定长度的 100 字节数据包在每个数据包之前发送“中断”。

    void ReadAndProcessPackets()
    {
      char buff[100];
      int count;
    
      count = 0;
    
    while (true)
    {
      char ch;
      if (ReadcharOrBreak(ch))
        count = 0; // start of packet - reset count
      else 
      {
         if (count < 100)
         {
           buff[count++] = ch;
           if (count == 100)
             ProcessPacket(buff);
         }
         else 
           Error("too many bytes rx'd without break")
      } 
    } 
    

    警告 - 完全未经测试,但应该给你的想法......

    有关使用 Break 的协议示例,请查看DMX-512 stage lighting protocol

    数据包的开始由 一个中断后跟一个“标记”(a 合乎逻辑的一)称为“标记之后 中断”(MAB)。中断信号结束 一个数据包和下一个数据包的开始。 它导致接收器启动 接待。突破后涨至513 插槽已发送。

    【讨论】:

    • 谢谢。我知道另一个答案的序列 101 的东西,但你部分回答了我正在寻找的东西。几个跟进。 1)你知道网络上是否有任何使用中断的协议。 2)当您收到中断信号时会发生什么,您如何处理它。您给出了一个发送示例,它是如何在接收时工作的?
    • 这回答了 OPs 问题的第一部分,但不是第二部分 - 如何判断是否从 DCE 打开/关闭中断。
    【解决方案2】:

    中断信号是无效字符。当 RS-232 线空闲时,电压处于“标记”(或“1”)状态(如果我没记错的话是 -12 伏)。当发送一个字符时,协议将线路切换到“空格”(或“0”)状态持续一位时间(起始位),然后根据数据(数据位)和任何奇偶校验位切换信号.然后它将线路保持在空闲/标记(或 1)状态,用于停止位定义的多个位,这通常是可配置的(根据我的经验,通常是 1 个停止位)。

    由于在数据字符之间总有一段时间行处于标记状态,因此始终可以识别字符的开头。这也意味着线可以处于空间状态的最长时间是:

    1 start bit + however many data bits + a parity bit (if any)
    

    中断信号被定义为将行保持在空间状态的时间超过该时间段 - 没有有效的数据字节可以做到这一点,因此中断“字符”不是真正的字符。这是一个特殊的信号。

    何时需要发出中断信号完全取决于所使用的协议。

    【讨论】:

    • 关于停止位数量的琐事 - 110 bps 通常为 2,所有其他速率为 1。电传打字万岁!
    【解决方案3】:

    'Break' 用于线路同步完全混乱时。

    我应该为我发送的每个数据字节保留它。或者发送一个字节的数据,然后切换。

    尝试发送一个不错的长“中断”信号(500 毫秒?),然后稍等片刻(50 毫秒?)然后发送数据。

    【讨论】:

      【解决方案4】:

      发送中断可以通过:

      • 降低比特率
      • 发送0x00 看起来像是中断。
      • 改回比特率。

      在休息期间,由于比特率不正确,将无法接收数据。

      我将此用于 Linbus 通信,其中有 1 个主发送中断,然后 0x55 作为同步。

      【讨论】:

        【解决方案5】:

        这不是一个真正的问题,但让我从我的 很久以前(实际上是 1980 年代) 作为通讯程序员的日子。您通常通过将所有位保持低来发送中断 或高(取决于您的通信硬件)。所以造成休息 要么重复发送值 0x00 大约半秒,要么发送值 0xFF。

        【讨论】:

        • 您忘记了开始位和停止位。发送 0x00 或 0xff 与中断不同。
        • 实际上,对于 1980 年代的大多数硬件 (IIRC) 来说,确实如此。硬件检测到的是长时间的电压差,而不是单个位。
        • @sheepsimulator 不是真的 - 那时每个人都在以任何可能的方式连接他们的计算机 - 理解通信是成为程序员的一部分,尽管我确实专注于它几年。
        • 您对延长电压差的看法是正确的,但是由于开始和停止位,没有有效的数据字符可以执行中断信号。
        • @Michael 我相信你的话,但我很确定当我编写代码来执行中断时,我没有更改停止/启动/奇偶校验位配置。但这是 25 年前的事了……
        【解决方案6】:

        您应该能够看到端口正在发送的数据。您需要一根零调制解调器电缆、一台带有串行端口(或串行 USB 加密狗)的计算机和一个终端程序(如 Windows 上的超级终端——Vista 中不包含)。如果您充分配置终端程序(正确的速度、数据位数、正确的启停设置和正确的端口),所有数据都将显示在屏幕上。 有时需要按回车键才能开始查看数据。您可以在测试期间切换终端程序的设置,以查看是否有变化(数据“噪音”)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多