初级会员

- 积分
- 85
- 金钱
- 85
- 注册时间
- 2018-9-6
- 在线时间
- 23 小时
|
3金钱
本帖最后由 周兵 于 2018-9-29 16:50 编辑
本人最近在做iap相关的升级时 遇到串口无法正常接收数据的问题 我的想法是通过上位机将数据打包为1k数据 在加上帧头帧尾
帧头 总包 包号 数据 帧尾 数据长度高八位 数据长度第八位
A0 25 00 .... 0A 94 0C
现在遇到的问题是我通过串口助手 可以很清楚的知道我上位机的 数据正确 那么我通过stm32中断的接收返回 发现数据异常
[mw_shl_code=applescript,true]void uart_init(u32 bound){
//GPIO¶Ë¿úéèÖÃ
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //ê1ÄüUSART1£¬GPIOAê±Öó
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸′óÃíÆíìêä3ö
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.9
//USART1_RX GPIOA.103õê¼»ˉ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.10
//Usart1 NVIC ÅäÖÃ
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇàÕ¼óÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×óóÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μàê1Äü
NVIC_Init(&NVIC_InitStructure); //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
//USART 3õê¼»ˉéèÖÃ
USART_InitStructure.USART_BaudRate = bound;//′®¿ú2¨ìØÂê
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæÅ¼D£Ñéλ
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //êÕ·¢Ä£ê½
USART_Init(USART1, &USART_InitStructure); //3õê¼»ˉ′®¿ú1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿aÆô′®¿ú½óêüÖD¶Ï
USART_Cmd(USART1, ENABLE); //ê1Äü′®¿ú1
}
#if EN_USART1_RX //èç1ûê1Äüá˽óêÕ
void USART1_IRQHandler(void) //′®¿ú1ÖD¶Ï·tÎñ3ìDò
{
u8 Res;
unsigned int hbit,lbit;
// hbit = (a)&0xf0>>4;
// lbit = (a)&0x0f;
#if SYSTEM_SUPPORT_OS //èç1ûSYSTEM_SUPPORT_OSÎaÕæ£¬ÔòDèòaÖ§3ÖOS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
{
// Res =USART_ReceiveData(USART1);//(USART1->DR); //¶á衽óêÕμ½μÄêy¾Y
Res =USART1->DR;
//
// if(USART_RX_CNT<USART_REC_LEN)
// {
// printf("%X",Res);
// USART_RX_BUF[USART_RX_CNT]=Res;
// USART_RX_CNT++;
// }
//hbit = ((Res)&0xf0)>>4;
// lbit = (Res)&0x0f;
// printf("%X__%d__%d__\r\n",Res,hbit,lbit);
if(Res!=0x0A&&state==6)
{
hbit = ((Res)&0xf0)>>4;
lbit = (Res)&0x0f;
printf("6.");
printf("%X\r\n",Res);
state_head[state-1]=hbit*16+lbit;
USART_RX_CNT_L=hbit*16+lbit;
USART_RX_CNT_Z= USART_RX_CNT_L +USART_RX_CNT_H;
state=0;
}
if(Res!=0x0A&&state==5)
{
hbit = ((Res)&0xf0)>>4;
lbit = (Res)&0x0f;
printf("5.");
//printf("%X\r\n",Res);
state_head[state-1]=hbit*16*16*16+lbit*16*16;
USART_RX_CNT_H=hbit*16*16*16+lbit*16*16;
state=6;
}
if(Res==0x0A&&state==4)
{
printf("4.");
// printf("%X\r\n",Res);
state_head[state-1]=Res;
state=5;
}
if((MAGE_BAOLEN==MAGE_BAOLEN_Z)&&state==3)
{
// printf("%X F\r\n",Res);
USART_RX_BUF[USART_RX_CNT]=Res;
USART_RX_CNT++;
printf("%d.\r\n",USART_RX_CNT);
if(USART_RX_CNT==USART_RX_CNT_Z)
state=4;
}
if((MAGE_BAOLEN<MAGE_BAOLEN_Z)&& (state==3))
{
// printf("%X f\r\n",Res);
USART_RX_BUF[USART_RX_CNT]=Res;
USART_RX_CNT++;
printf("%d.\r\n",USART_RX_CNT);
if(USART_RX_CNT==1024*(MAGE_BAOLEN+1))
state=4;
}
if(state==2&&Res<=MAGE_BAOLEN_Z)
{
hbit = ((Res)&0xf0)>>4;
lbit = (Res)&0x0f;
state_head[state]=hbit*10+lbit;
MAGE_BAOLEN=hbit*10+lbit;
state=3;
// printf("3.");
// printf("%X\r\n",Res);
//printf("%d \r\n",MAGE_BAOLEN);
}
if(state==1)
{
hbit = ((Res)&0xf0)>>4;
lbit = (Res)&0x0f;
state_head[state]=hbit*10+lbit;
MAGE_BAOLEN_Z=hbit*10+lbit;
state=2;
printf("2.");
// printf("%X\r\n",Res);
//printf("%d\r\n",MAGE_BAOLEN_Z);
}
if(Res==0xA0&&state==0)
{
printf("1.");
// printf("%X\r\n",Res);
state_head[state]=Res;
state=1;
}
if((USART_RX_CNT==USART_RX_CNT_Z)&&(USART_RX_CNT==MAGE_BAOLEN_Z)&&(USART_RX_CNT!=0))
{
USART_RX_END=1;
}else
{
USART_RX_END=0;
}
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
#if SYSTEM_SUPPORT_OS //èç1ûSYSTEM_SUPPORT_OSÎaÕæ£¬ÔòDèòaÖ§3ÖOS.
OSIntExit();
#endif
}
#endif
[/mw_shl_code] |
|