RS 232中断信号

时间:2009-08-14 18:39:21

标签: vb6 hardware serial-port

我有一个RS232信号捕获设备。它运作良好。

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

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

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

6 个答案:

答案 0 :(得分:8)

迈克尔伯尔对破解方式的描述是准确的。通常,“中断”信号的发送时间明显长于一个字符时间。

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

要发送休息时间,通常请拨打SetCommBreak,等待一段适当的时间(例如,大约2毫秒,9600波特),然后拨打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可能是处理传入Break的关键。

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

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

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   合乎逻辑的一个)被称为“Mark After   打破“(MAB)。休息信号结束   一个数据包和下一个数据包的开始。   它会使接收器启动   接收。分手后到513   插槽已发送。

答案 1 :(得分:6)

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

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

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

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

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

答案 2 :(得分:1)

'Break'适用于线路同步完全混淆的情况。

  

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

尝试发送一个漂亮的长'break'信号(500 ms?)然后等一下(50 ms?)然后发送你的数据。

答案 3 :(得分:1)

发送中断可以通过以下方式实现:

  • 降低比特率
  • 发送0x00似乎很麻烦。
  • 改回比特率。

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

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

答案 4 :(得分:0)

这不是一个真正的问题,但让我从我的东西中挖掘出一些东西 过去(事实上是80年代) 作为通讯程序员的日子。您通常通过将所有位保持为低位来发送中断 或高(取决于你的通讯硬件)。所以要休息一下 重复发送值0x00大约半秒,或者值0xFF。

答案 5 :(得分:0)

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