我有一个RS232信号采集设备。 它工作的伟大。
我需要的数据有一定的帮助决策意识。 基本上,我们买了它,因为我们正在处理的是采用串行通信的80年代末的机器控制器。 尽管知道端口参数我们有一点运气。
从数据I倾倒机控制是使用中断信号,因为它的协议的一部分。 我无法用VB和MSComm控件复制它。 我所知道的,并启用和禁用中断信号。 但我不知道我应该用它做什么。 我应该把它打开,我送的每个数据字节。 或发送一个字节的数据,然后切换。
此外,我很困惑,我应该如何从控制器接收到任何数据。 难道我切换标志当断接通,然后当它关闭读取输入?
途中休息的作品迈克尔·伯尔的描述是准确的。 通常情况下,“破发”信号是对显著超过一个字符时发送更长。
这些天来,“破发”不常在串行通信中使用,但最常见的用途是为提供分组同步的“便宜”的方式。 “断开”可以被发送的数据包开始之前,以警告接收器,一个新的分组是在路上(并允许它复位缓冲液等)或在分组的末尾,以信号通知没有更多的数据,预计。 这是一种“元字符”,因为它可以让你保持全方位的数据包内容8或7位值,而不必担心如何启动或包结束的圈定。
发送中断,通常你调用SetCommBreak ,(在9600波特说,大约2个millseconds)等待合适的时间,然后调用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")
}
}
警告 - 没有经过测试的,但应该给你的想法...
对于使用断裂时的协议的示例,检查出DMX-512舞台灯光协议 。
一个包的开始是由一个中断,随后被称为“标记符后”(MAB)一个“标记”(逻辑一)所指。 一个分组的分割信号结束和下一个的开始。 它使接收机开始接收。 中场休息后高达513个插槽发送。
中断信号是无效字符。 当RS-232线路空闲时,电压在“标记”(或“1”)状态(这是-12伏如果记得右)。 当发送一个字符时,协议切换行到“空间”(或“0”)一个位时间(开始位),则切换信号以适合的数据(数据位)和任何奇偶校验位的状态为。 然后,它适用于许多由停止位定义的位,这是通常配置的(在我的经验,通常1个停止位)在空闲/标记(或1)状态的线。
由于总是有时间,其中线将在数据字符之间的标记状态一段时间,一个字符开始总是可以被识别。 这也意味着,该线路可以是一个空间状态的时间最长是:
1 start bit + however many data bits + a parity bit (if any)
中断信号被定义为持有的空间状态的线比那段时间更长 - 没有有效的数据字节可以做到这一点,所以破解“字”是不是一个真正的角色。 这是一个特殊的信号。
至于当你需要发出中断信号作为完全取决于所使用的协议。
“休息”之意时,行同步得到完全混了。
我应该把它打开,我送的每个数据字节。 或发送一个字节的数据,然后切换。
尝试发送一个不错的长期“破发”信号(500毫秒?)然后等待一个位(50毫秒?),然后把你的数据。
不是一个真正的SO问题,但让我从我的长过去疏浚的东西(其实是20世纪80年代)天为一个通讯科程序员。 您通常通过持有所有位低或高的发送中断(取决于您的COMMS硬件)。 因此,为了使中断或者发送值为0x00反复约半秒,或返回0xFF。
你应该能够看到该端口发送数据。 你需要一个零调制解调器电缆,串行端口(或串行USB加密狗)和终端程序的计算机(如Windows上的HyperTerminal - 不包含在Vista中)。 如果配置适当的终端程序(正确的速度,对数据的位数,起停正确的设置,以及正确的端口)的所有数据会显示在屏幕上。 有时它是该电源线打回车键开始看到的数据。 您可以在测试过程中触发对终端程序的设置,看看是否有新的变化(“噪音”数据)。