📄 sio.c
字号:
#include <REG52.H>
#include <extern.h>
#include <constant.h>
#include <function.h>
void SendStr(unsigned char *sdata)
{
ES=0;
while(*sdata!='\0')
{
SBUF=*sdata;
while(!TI);
TI=0;
sdata++;
}
ES=1;
}
void SendBuffer(unsigned char *sdata,unsigned char num)
{
ES=0;
while(num)
{
SBUF=*sdata++;
while(!TI);
TI=0;
num--;
}
ES=1;
}
//功能:先设置帧首和帧尾,然后计算校验和,再把buf_sio缓冲区中的数据发送出去
//
//
void SioTransmit()
{
unsigned char i;
buf_sio[13]=SIO_CMD_HEAD;
buf_sio[1] =buf_sio[12];
buf_sio[1] +=buf_sio[11];
buf_sio[1] +=buf_sio[10];
buf_sio[1] +=buf_sio[9];
buf_sio[1] +=buf_sio[8];
buf_sio[1] +=buf_sio[7];
buf_sio[1] +=buf_sio[6];
buf_sio[1] +=buf_sio[5];
buf_sio[1] +=buf_sio[4];
buf_sio[1] +=buf_sio[3];
buf_sio[1] +=buf_sio[2];
buf_sio[1] =~buf_sio[1];
buf_sio[1] +=1;
buf_sio[0] =SIO_CMD_END;
i=SIO_BUF_LEN-1;
ES=0;
do
{
SBUF=buf_sio[i];
while(!TI);
TI=0;
}while(i--);
ES=1;
}
//功能:清除缓冲区的数据,使其全0
//buf:缓冲区地址
//num:缓冲区大小
void ClearBuffer(unsigned char *buf,unsigned char num)
{
while(num)
{
*buf=0x00;
buf++;
num--;
}
}
//功能:设置发送缓冲区
//cFlagSuccess:串口数据帧中的命令字
//
void SetSuccessFlag(unsigned char cFlagSuccess)
{
buf_sio[12] =cFlagSuccess;
buf_sio[11] =0x00;
buf_sio[10] =0x00;
buf_sio[9] =0x00;
buf_sio[8] =0x00;
buf_sio[7] =0x00;
buf_sio[6] =0x00;
buf_sio[5] =0x00;
buf_sio[4] =0x00;
buf_sio[3] =0x00;
buf_sio[2] =0x00;
}
//功能:发送指定的EEPROM数据
//addr:eeprom首地址
//num:读取的eeprom数据数量
void UploadEeprom(unsigned char addr,unsigned char num)
{
// buf_sio[11]=addr;
// buf_sio[10]=num;
ClearBuffer(buf_eeprom,8);
ReadEEPROM(addr,buf_eeprom,num);
buf_sio[9]=buf_eeprom[0];
buf_sio[8]=buf_eeprom[1];
buf_sio[7]=buf_eeprom[2];
buf_sio[6]=buf_eeprom[3];
buf_sio[5]=buf_eeprom[4];
buf_sio[4]=buf_eeprom[5];
buf_sio[3]=buf_eeprom[6];
buf_sio[2]=buf_eeprom[7];
SioTransmit();
}
//功能:通过串口写EEPROM
//
//
void DownloadEeprom(void)
{
buf_eeprom[0]=buf_sio[9];
buf_eeprom[1]=buf_sio[8];
buf_eeprom[2]=buf_sio[7];
buf_eeprom[3]=buf_sio[6];
buf_eeprom[4]=buf_sio[5];
buf_eeprom[5]=buf_sio[4];
buf_eeprom[6]=buf_sio[3];
buf_eeprom[7]=buf_sio[2];
if(WriteEEPROM(buf_sio[11],buf_eeprom,buf_sio[10]))
SetSuccessFlag(CMDFAILURE);
else
SetSuccessFlag(CMDSUCCESS);
SioTransmit();
}
void UploadTV_Status(unsigned char HiOrMid)
{
if(!ReadTV_Status(buf_sio[11],buf_eeprom))
{
buf_sio[12]=HiOrMid;
buf_sio[10]=buf_eeprom[0];
}
else
SetSuccessFlag(CMDFAILURE);
SioTransmit();
}
void ModulateTV(void)
{ unsigned char i;
for(i=0;i<buf_sio[10];i++)
buf_eeprom[i]=buf_sio[9-i];
if(!SetTV_Module(buf_sio[11],buf_eeprom,buf_sio[10]))
SetSuccessFlag(CMDSUCCESS);
else
SetSuccessFlag(CMDFAILURE);
SioTransmit();
}
//-----------SIO Data Deal------------------
//功能:串口接收数据的处理
//
//
void DealSioData(void)
{
unsigned char chksum,i;
chksum=0;
for(i=SIO_BUF_LEN-2;i>0;i--)
{
chksum+=buf_sio[i];
}
if(chksum)
{
SetSuccessFlag(SUMERROR);
SioTransmit();
return;
}
switch(buf_sio[12])
{
case CMDTEST:
SioTransmit();
break;
case CMDVENDOR:
break;
case UPLOADEEPROM:
UploadEeprom(buf_sio[11],buf_sio[10]);
break;
case DOWNLOADEEPROM:
DownloadEeprom();
break;
//////////////////////////////////////////////////////////
case READTV_MidFreq:
UploadTV_Status(RETURNTV_MidFreq);
break;
case READTV_HighFreq:
UploadTV_Status(RETURNTV_HighFreq);
break;
case SETTV_HighFreq:
ModulateTV();
break;
case SETTV_MidFreq: //0x0A
ModulateTV();
break;
case TESTCDCFORWARD: //CDC快进
WriteByteToCDC(CDCNext);
ms_delay=54;
while(ms_delay);
CDCRewrite();
for(i=0;i<buf_sio[11];i++)
{
ms_delay=95;
while(ms_delay);
CDCRewrite();
}
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -