📄 usart1.c
字号:
interrupt void Rx0Int(void) //接收中断
{
unsigned int t, i, ibuf, num;
unsigned char ByteCom;
EA = 0;
R0EN =1;
t=0;
ReTrySoeTimes=0;
CrcCheck=0;
//数据接收过程
for(;;)
{
i=50;
ibuf=10;
while(!RI0)
{
FeedDog();
ibuf--;
if(ibuf==0)
{
i--;
ibuf=10;
if(i==0)
{
EA =1;
if( t!=15)
{
if(ReTrySoeTimes>10)
{
return;
}
}
}
}
}
RI0=0;
Rxd0.Data[t]=S0BUF;
FeedDog();
t++;
//数据接收完毕后处理
if( t==15)
{
int i;
//计算CRC校验
for(i=0;i<14;i++)
{
CrcCheck=CheckCRC(CrcCheck,Rxd0.Data[i]);
}
if(CrcCheck==Rxd0.Data[14]) //接收正确
{
RxdMessage = 1;
return;//
}
else //接收错误
{
if(ReTrySoeTimes>3)
{
RxdMessage = 0;
return;
}
ReTrySoeTimes++;
RxdMessage = 0;
return;
}
}
}
return;
}
//接收完毕数据返回过程
void Ri0Process (int slave,int addr,int num,unsigned char buf[])
{
int retval;
unsigned char Rxdbuf[100];
unsigned char Txdbuf[10];
unsigned int i,j,len,RecLength;
union
{ unsigned int Word;
unsigned char Byte[2];
} CRC;
Txdbuf[0]=(unsigned char)slave;
Txdbuf[1]=01;
Txdbuf[2]=(unsigned char)(((unsigned int)addr) >> 8); //Addr(High)
Txdbuf[3]=(unsigned char)(((unsigned int)addr) & 0xff); //Addr(Low)
Txdbuf[4]=(unsigned char)(((unsigned int)num) >> 8); //Length_High
Txdbuf[5]=(unsigned char)(((unsigned int)num) & 0xff); //Length_Low
CRC.Word=0xffff; //Recived Data CRC Check,6bytes
for(i=0;i<6;i++)
CRC.Word = MBus_CRCGen(Txdbuf[i],CRC.Word);
Txdbuf[6] = CRC.Byte[0]; //Produce Transmited Data CRC code
Txdbuf[7] = CRC.Byte[1];
if(num%8 == 0)
len = num/8;
else
len = num/8+1;
RecLength = len+5;
SendProcess(Txbuf,8); //调用发送过程函数,发送长度为8个字节
}
/****************************************/
/* 系统主程序 */
/****************************************/
void main(void)
{
EA=1;
for(;;)
{
if(RxdMessage==1)
{
RxdMessage = 0;
//----
Ri0Process();
//----
}
}
}
//触摸屏作为通信从站的通信程序
//触摸屏作为通信的从站时,单片机的通信流程应该是这样的:单片机的主程序每隔一段时间就会发送一个通信数据包给触摸屏,然后在串行口通信中断中接收触摸屏返回的数据,单片机将这些数据进行相应的处理。
void ReceDataProcess(unsigned char *RxBuf)
{
//数据保存过程,略去。
}
interrupt void Rx0Int(void) //接收中断
{
unsigned int t, i, ibuf, num;
unsigned char ByteCom;
EA = 0;
R0EN =1;
t=0;
ReTryTimes=0;
CrcCheck=0;
//数据接收过程
for(;;)
{
i=50;
ibuf=10;
while(!RI0)
{
FeedDog();
ibuf--;
if(ibuf==0)
{
i--;
ibuf=10;
if(i==0)
{
EA =1;
if( t!=15)
{
if(ReTryTimes>10)
{
return;
}
}
}
}
}
RI0=0;
Rxd0.Data[t]=S0BUF;
FeedDog();
t++;
//数据接收完毕后处理
if( t==15)
{
int i;
//计算CRC校验
for(i=0;i<14;i++)
{
CrcCheck=CheckCRC(CrcCheck,Rxd0.Data[i]);
}
if(CrcCheck==Rxd0.Data[14]) //接收正确
{
ReceDataProcess(Rxd0.Data);
return;//
}
else //接收错误
{
return;
}
}
}
return;
}
/****************************************/
/* 系统主程序 */
/****************************************/
main()
{
//
for(;;)
{
wSendLength = SendDataPrepare(2,2,1, Sendbuf);
SendDataProcess(wSendLength, Sendbuf);
DelayTime(200);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -