我有一个RS232信号捕获设备。它运作良好。
我需要一些帮助来理解数据。基本上我们买它是因为我们正在处理使用串行通信的80年代后期的机器控制器。尽管知道了端口参数,但我们运气不佳。
从我倾倒的数据中,机器控制使用中断信号作为其协议的一部分。我无法使用VB和MSComm复制它。我知道要打开和关闭中断信号。但我不确定我应该用它做什么。我应该为我发送的每个数据字节保留它。或者发送一个字节的数据然后切换。
我也很困惑,我应该从控制器接收任何数据。打开中断时是否切换标志,然后当它关闭时读取输入?
答案 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键才能开始查看数据。您可以在测试期间切换终端程序的设置,以查看是否有变化(对数据“噪音”)。