这些够用了
void USART_Initial(void)
{
BYTE i;
USART_DeInit(USART1);
USART_StructInit(&USART_InitStructure);
USART_Init(USART1,&USART_InitStructure);
USART1->CR1|=0x206c; //;USART模块使能,允许接收发送,使能USART中断
USART1->BRR=0x1A0A;//BaudRate;//; //19133 bits/s;
sentIntervalDelay = 0;
scisenthead = 0;
scisentfail = 0;
for(i=0;i<scisentbuffersize;i++)
scisentbuffer[i] = Null;
}
void USART1_IRQHandler(void)
{
#define LCD485_Address 0x10
BYTE RecTemp;
if(USART1->SR&0x40) //发送
{
USART1->SR&=~0x40;
if(SCIStartSent)
{
if(SendCounter<SendBuffer[0])
USART1->DR= SendBuffer[SendCounter++];
else
{
if(!SCIRece)sentIntervalDelay = 3; // 3ms 完成一循通信稍做延时以便SCI有空闲做下次通信,此种情况专属sentkey
//SCIErrorCN=0;
SCISentDis;
SendCounter=0;
SCIStartSent=0;
}
}
}
if(USART1->SR&0x20) //接收
{
RecTemp=USART1->DR;
if(AddrEqual==0)
{
if(RecTemp==LCD485_Address)
{
AddrEqual=1; //被正确询址
}
}
else
{
if(SendCounter==0)
ReceBuffer[SendCounter++]=RecTemp; //接收到长度
else if(SendCounter<ReceBuffer[0])
ReceBuffer[SendCounter++]=RecTemp;
if(SendCounter==ReceBuffer[0])
{
SendCounter=0;
if(SCIRece)
{
SCIRece=0;
//SCIErrorCN=0;
sentIntervalDelay = 3; // 3ms 完成一循通信稍做延时以便SCI有空闲做下次通信
// scisentpnter = Null;
}
FinishedRece=1; //完成一帧数据接收
AddrEqual=0;
}
}
}
}
void Timer1msEvent(void)
{
ScanSCIsentbuffer();
if(FinishedRece)
{
AnalyseReceDatas();
FinishedRece=0;
}
}
/**************************************************************************
分析接收返回的数据信息
***************************************************************************/
void AnalyseReceDatas(void)
{
WORD Length,CheckSum;
Length=ReceBuffer[0]; /*获取一帧数据长度*/
CheckSum=(ReceBuffer[Length-1]<<8)+ReceBuffer[Length-2]; /*最后两个为高低校验码*/
if(CheckSum==CrcValueByteCalc(&ReceBuffer[1],(Length-3)))
{
switch(ReceBuffer[1])
{
case CommuACK:
SCIReady=1;
break;
case KeySent:
break;
default:
break;
}
}
}
|