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
插槽已发送。