本帖最后由 cjlong 于 2016-2-29 10:36 编辑
在做一个与电机驱动器通讯的项目的时候需要用到串口再通过485发送数据和接收数据
遇到的问题是,用串口循环发送数据的时候,可以用串口接收中断接收到数据,但是用串口发送中断发送数据的时候,串口就不能接收到数据,TC中断和TXE中断都试过了,都不能行
调试了好几天都找不到问题在哪儿,大家帮忙看看,到底是哪里有什么问题,谢谢大家!
串口配置代码如下:
void RS485_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
//′®¿ú2òy½Å¸′óÃó3éä
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3
//USART2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA,&GPIO_InitStructure); //
//PG8íÆíìêä3ö£¬485Ä£꽿ØÖÆ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOG8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOG,&GPIO_InitStructure); //
//USART2
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE); //ê1Äü′®¿ú 2
USART_ITConfig(USART2, USART_IT_TC, ENABLE);
#if EN_USART2_RX
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
//Usart2 NVIC ÅäÖÃ
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
RS485_TX_EN=0;
}
数据发送函数://分割线上面注释的使用循环发送的方式,下部试图用中断发送的方式
void RS485_Send_Data(u8 *buf,u8 len)
{
// u8 t;
// RS485_TX_EN=1;
// for(t=0;t<len;t++)
// {
// while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
// USART_SendData(USART2,buf[t]); //
// }
// while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
//
// TIM7_ENABLE();
// receCount = 0;
// RS485_TX_EN=0;
/*******************************************************/
RS485_TX_EN=1;
sendPos = 0;
USART_SendData(USART2,sendBuf[sendPos++]);
}
串口中断函数:
void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearFlag(USART2, USART_FLAG_RXNE);
if(USART_GetFlagStatus(USART2,USART_FLAG_PE)==RESET)
{
receBuf[receCount]= USART_ReceiveData(USART2);
receCount++;
}
}
if(USART_GetITStatus(USART2, USART_IT_TC) != RESET)
{
if(firstTime == 1)
{
USART_ClearFlag(USART2, USART_FLAG_TC);
firstTime = 0;
printf("first time of TC
");
}
else if(sendPos < sendCount)
{
USART_SendData(USART2,sendBuf[sendPos++]);
printf("send %dth data
",sendPos);
}
else
{
USART_ClearFlag(USART2, USART_FLAG_TC);
TIM7_ENABLE();
receCount = 0;
RS485_TX_EN=0;
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
占用时间 ,去了试试
哈哈 试了一下 果然去了就好了,感谢大神!
本来printf是用来调试的,可能是因为printf用了串口一,两个可能冲突了吧...
唉,范蠢了,都没想到是这个上面的问题,还调试了好久别的地方...
一周热门 更多>