[mw_shl_code=c,true]void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//判断是否发生TIM2更新中断
{
TIM_Cmd(TIM2,DISABLE); //关掉定时器2
TIM_SetCounter(TIM2, 0);//重新设初值0
if(recenum >= 8)
{
Uart1_rev_flag = 1;//接收完毕一帧,置位标志位,通知主函数调用接收处理函数
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//失能串口1接收中断
}
recenum = 0;
GPIO_SetBits(GPIOF,GPIO_Pin_13);//485发送使能
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除TIM2的中断待处理位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM2待处理标志位
}
}
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//接收中断
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除USART1中断待处理位RXNE(RXNE=0)
if(Uart1_rev_flag != 1)
{
if(recenum < 12)//接收分8字节数据 和11字节数据
{
ReceBuf[recenum] = USART1->DR;
recenum++;
TIM_Cmd(TIM2, ENABLE);
TIM_SetCounter(TIM2, 0);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}
}
}
/*if(USART_GetITStatus(USART1,USART_IT_TXE)!=RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_TXE);//清除USART1中断待处理位RXNE(RXNE=0)
USART_SendData(USART1,ReceBuf[sendnum]);
sendnum++;
if(sendnum == 8)
{
LED4(ON);
sendnum = 0;
USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
//USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//打开接收中断使能
//GPIO_ResetBits(GPIOF,GPIO_Pin_13);//485使能接收
}
}*/
//溢出-如果发生溢出需要先清空SR的溢出位,再读DR寄存器 则可清除不断入中断的问题
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)!=RESET)
{
USART_ClearFlag(USART1,USART_FLAG_ORE); //清溢出位
USART_ReceiveData(USART1); //读DR
}
}[/mw_shl_code]
这是我中断函数,为什么我接收到的第一个数据不是设备地址0x01,但是我用串口监控,看到的是01 03 00 00 00 01 84 0A,但是接收之后就不行了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
aRxBuff[4] 和 aRxBuff[5] 是寄存器数量的高位和低位 这样是将十六进制转为十进制
这里要乘以2是因为传输是是无符号的16位数据 每个数据占两个字节
(aRxBuff[4] * 256 + aRxBuff[5])*2 = 要返回的数据字节数
前面的5 分开来 从机地址+功能码+数据字节数+CRC低+CRC高
所以:Sendnum = 回发的总字节数
usDataLen = sendnum - 2; 是除去CRC校验的字节数
因为CRC校验是在前面这些数据的基础上计算的 在计算CRC校验时只需要前面的数据
也就是crcData = crc16(ReceBuf,usDataLen);
一周热门 更多>