迈克尔·伯尔 (Michael Burr) 对休息工作方式的描述是准确的。通常,发送“中断”信号的时间明显长于一个字符的时间。
如今,“Break”在串行通信中很少使用,但最常见的用途是作为提供数据包同步的“廉价”方式。 “Break”可以在数据包开始之前发送,以提醒接收者新的数据包正在路上(并允许其重置缓冲区等),或者在数据包结束时发送,以表明不再需要数据。它是一种“元字符”,因为它允许您保留数据包内容的 8 位或 7 位值的完整范围,而不必担心如何描述数据包的开头或结尾。
要发送中断,通常您调用设置通讯中断 http://msdn.microsoft.com/en-us/library/aa363433%28VS.85%29.aspx,等待一段适当的时间(例如,9600 波特率下约 2 毫秒),然后调用清除通讯中断 http://msdn.microsoft.com/en-us/library/aa363179%28VS.85%29.aspx。当然,在此期间您不能发送任何其他内容。
因此,假设协议需要在数据包开头“中断”,我会这样做(抱歉伪代码):-
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 语言编写,并假设存在一个虚函数。等待通信事件 http://msdn.microsoft.com/en-us/library/aa363479%28VS.85%29.aspx可能是处理传入中断的关键。
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舞台灯光协议 http://en.wikipedia.org/wiki/DMX512-A.
数据包的开始表示为
一个中断,后跟一个“标记”(a
逻辑一)称为“标记后
中断”(MAB)。中断信号结束
一个数据包和下一个数据包的开始。
它导致接收器启动
接待。分手后到513
时隙已发送。