库函数:STM32F10x_StdPeriph_Lib_V3.5.0
MCU: STM32F103VET6
我用串口1中断收数据,查询发!这些收到的数据均有固定长度,数据头开始后的第7位为这一帧数据的长度;现在想对收到的数据先进行判断如果头几位是0x24 0x44 0x57 0x53 0x51的话 就接收;
然后这一帧数据的末尾是校验和;这个校验和是从头开始到检验和前一字节按位异或的结果,这个校验和占一个字节。
我中断收发是网上找的例子,可以进行判断;这个求校验和我写的,怎么出来的结果是 串口1只能显示0x24;不知道为什么?请大家帮助!
void USART1_IRQHandler()
{
while(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) //中断产生
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志
Usart1_Buffer[Usart1_Rx] = USART_ReceiveData(USART1);
Usart1_Rx++;
Usart1_Rx &= 0xFF;
}
if((Usart1_Buffer[Usart1_Rx-1] == 0x51)&&(Usart1_Buffer[Usart1_Rx-2] == 0x53)&&(Usart1_Buffer[Usart1_Rx-3] == 0x57)&&(Usart1_Buffer[Usart1_Rx-4] == 0x44)&&(Usart1_Buffer[Usart1_Rx-5] == 0x24))
{
Usart1_Tx = Usart1_Rx-5;
n = Usart1_Rx-5;
checksum = Usart1_Buffer[Usart1_Tx];
/****************************************************************************
填充检验和
*******************************************************************************/
for(i = 0;i < Usart1_Buffer[Usart1_Tx+7]-1;i++,++Usart1_Tx)
{
checksum = checksum ^ Usart1_Buffer[Usart1_Tx];
}
Usart1_Buffer[Usart1_Tx] = checksum;
Usart1_Len = Usart1_Tx-n;
Usart1_Sta=1; //标志位
}
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET) //溢出
{
USART_ClearFlag(USART1,USART_FLAG_ORE); //读SR
USART_ReceiveData(USART1); //读DR
}
}
int main(void)
{
u8 tx1;
Rcc_Configuration();
UsartGPIO_Configuration();
Usart_Configuration();
USART_NVIC_Config();
while(1)
{
if( Usart1_Sta )
{
for(tx1=0;tx1 <= Usart1_Len;tx1++,n++)
//USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据
{
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_SendData(USART1, Usart1_Buffer[n]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
USART_ClearFlag(USART1,USART_FLAG_TC);
}
Usart1_Rx = 0; //初始化
Usart1_Tx = 0;
Usart1_Sta = 0;
n = 0;
}
}
}
|