我使用的一个PC-MCU通讯程序(实用的)
char xdata * pSend;
bit bSerRcved;
// 假设所有的数据存放在XDATA中
//
// 在发送数据的时候将pSend设置好,指向要发送的数据
// 数据包的格式
// START_F + CMD + DATAS + CHECKSUM + END_F
// 定义 START = 0X7E, END_F = 0X7F, ESC_F = 0X7D
// 当数据中包含以上3个字符时, 转义, 方法是
// 转义后的字符 = 转移前的字符 ^ 0x20
// eg : 30, 40, 7e, 55, 7f ---> 30, 40, 7d, 5e, 55, 7d, 5f
// --- --- ------- ------
//
// lenglianxi@tom.com
SerProc() interrupt 4 using 2
{
static char xdata * pRcv;
static uchar cCheckSum;
static bit bEsc, bRcving;
uchar cTemp;
if(TI){
TI = 0;
if(bSendFin){
bSendFin = 0;
REN = 1;
}
else{
cTemp = *pSend;
pSend++;
SBUF = cTemp;
if(cTemp == END_F)
bSendFin = 1;
}
}
// recived some data
else{
RI = 0;
cTemp = SBUF;
switch(cTemp){
case START_F:
pRcv = SerBuf+1;
SerBuf[0] = START_F;
cCheckSum = START_F;
bEsc = 0;
bRcving = 1;
break;
case END_F:
ES = 0;
cCheckSum += END_F;
bSerRcved = 1;
bCheckSumErr = cCheckSum == 0 ? 0 : 1;
bRcving = 0;
break;
case ESC_F:
bEsc = 1;
break;
default:
if(bRcving){
if(bEsc)
*pRcv = cTemp ^ 0x20;
else
*pRcv = cTemp;
cCheckSum += *pRcv;
pRcv ++;
bEsc = 0;
}
}
}
}
发表时间:2004年7月16日13:36:59