3.7 通用数据接收函数ReadDataDelay
在串行通信中,数据的传输是不连续的,因而,在处理数据接收时,应该将不连续的数据进行叠加,形成一个完整的数据包。本文设计的ReadDataDelay函数实现这一功能,用来从指定的串口nPort接收数据,保存在字节数组bData中,其中,下标为0的字节表示该字节数组的长度,其它为有效字节。nDelayMs是需要等待的节拍数,即在nDelayMs个节拍之内收到的数据,认为是一批数据,依次进行叠加(否则,认为是下一批数据),该参数可以根据机器时钟周期的大小进行调整。该函数的源代码如下。
void ReadDataDelay(int nPort, byte *bData, unsigned long nDelayMs)
{
int nData=0; /*对收到的字节计数*/
unsigned long iCount=0; /*对等待的节拍计数*/
while(iCount < nDelayMs)
{
if(IsCom(nPort)==QueueIsNotEmpty)
{
nData++; /*收到的字节数加1*/
bData[nData] = ReadCom(nPort); /*将收到的字节存入数组*/
iCount = 0; /*重新计数,准备接收随后的数据*/
if(nData > 255) break; /*255是设定的最大的数据包长度*/
}
else iCount++; /*没有数据,则等待的节拍加1*/
}
bData[0] = nData; /*保存收到的字节数*/
}
4 通信函数的应用
通用的数据发送函数SendData与数据接收函数ReadDataDelay实现了简捷的数据传输任务,屏蔽了数据传输的繁琐的细节问题。在嵌入式模块中实现串行通信,首先通过InstallCom函数初始化串行接口,然后,通过SendData函数发送一批数据,等待数据到达。IsCom用于测试是否有数据,典型的关键实例代码如下。
|