27,373
社区成员
发帖
与我相关
我的任务
分享
/*
单字节传输数据时,如果数据可能会占用0~255所有的值,则起始信号判断是个普遍问题。
本文件是发送端和接收端的数据处理程序,在原有单字节传输的基础上套用本协议,可以从单字节传输中扩展出最多127个控制信号。
*/
/*最小控制信号MinCtrl
采用的方法是这样的:从 0~MinCtrl-1 仍然作为数据,这个范围内的数据一个字节便可传输;
从MinCtrl到0xff腾出来作为控制信号,其中MinCtrl是特殊的控制信号,它标志着
下一个字节的数据要加上MinCtrl作为真正接收到的数据。在发送端,当要发送的数据
dat>=MinCtrl时,将分为两个字节发送,第一个字节发送MinCtrl,第二个字节发送
dat-MinCtrl。
在 ( MinCtrl, 0xff ] 范围内的数可以单独作为控制信号。
注:
MiniCtrl取得越小,可以容纳的控制信号越多,但是数据需要发送两个字节的概率
就越大。所以根据具体传输的需求,让MinCtrl尽可能大,这样需要两个字节传输数据的
概率就小,会提高传输速度;
MinCtrl最小值是0x80,如果MinCtrl小于0x80,则下一字节的数据会大于MinCtrl,
为了不让数据与控制信号出现同样的值,规定 MinCtrl>=0x80;
发送端和接收端的 MinCtrl 必须定义相同的值。 */
//发送端:
#define MinCtrl 0xfe //( MinCtrl, 0xff ] 可用作控制信号,发送端和接收端这个定义应当相同
/********************扩展处控制信号的数据发送函数***************************/
void ExpendedSend(unsigned char dat)
{
if(dat<MinCtrl) //可以直接发送
{
//下面是原来发送一个字节的函数
SCI_sendB(dat);
}
else //说明在控制信号范围内,要分两次发送
{
//下面是原来发送一个字节的函数
SCI_sendB(MinCtrl);
delayForSend(); //这是连续发送两字节的延时,根据接收端的响应速度调整
SCI_sendB(dat-MinCtrl);
}
}
/***************************************************************************/
/*************************扩展出控制信号的数据接收函数*********************
把接收到的数据传进此函数,在此函数中判断是控制信号还是数据,以及根据约定好的协议
得出数据的值。
/***************************************************************************/
void ExpendedRec(unsigned char get)
{
static unsigned char FlagMinCtrl=0; //标志本次接收到的数据是否需要加上MinCtrl,0-不要,1-要
unsigned char dat; //这是经过协议计算后的真正接收到的数据
if(get==MinCtrl) //说明下一个字节加上MinCtrl就是一个数据
{
FlagMinCtrl=1;
goto RecEnd;
}
else if(get>MinCtrl) //说明在控制信号范围内
goto DealCommand;
else //get在数据范围内,肯定标志着接收到了一个数据,但还要判断是否需要加上MinCtrl
{
if(FlagMinCtrl==1) //要
{
FlagMinCtrl=0;
dat=get+MinCtrl;
goto DealData;
}
else if(FlagMinCtrl==0) //不要,本次数据就是一个小于MinCtrl的数据
{
dat=get;
goto DealData;
}
}
DealCommand:
//当前的get就是命令,下面是对命令的处理
return;
DealData:
//当前dat的值就是接收到的数据,下面对其处理
return;
RecEnd: //结束
return;
}
/********************************************************************************/