求助论坛大神们,一个简单的串口例程,就是参照论坛里有的很多了;;
两个单片机,都分别用USART1发送,USART2接收;可以很好地通信;
但是这样就把串口资源占满了啊;既然串口可以双向通信,那我想设置两个单片机都用USART2,进行接收和发送就不行了呢???
都用接收中断,配置好后就无法通信了,请教各位大神们!
中断函数
int main(void)
{
SystemInit(); //系统时钟设置
delay_init(72); //延时初始化
USART_ConfigForCom_TX();
while(1)
USART_SendData(USART2,TxBuffer[0]);
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);//每发送一次都要检查发送完成否
while(RxBuffer[flag]!='\0')
/ printf("c%",RxBuffer[0);
}
void USART2_IRQHandler(void)
{
int i=0; //中断内读取字符串组用
flag=0; //主函数中打印字符串组用,每进一次中断就清零
// GPIO_Write(GPIOF,0X340); //进入中断的指示灯
if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET) //确保是接收中断发生
{
while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==SET) //当接收数据寄存器不为空时就不停地接收
{
RxBuffer[i++]=USART_ReceiveData(USART2); // 将接收到的数据放入缓冲数组里
}
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清接收中断标志位,不然退不出中断
}
串口设置:
void USART_ConfigForCom_TX(void)
{
//定义GPIO,,NVIC,USART结构体
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
//开PA口复用时钟,初始化系统时钟
SystemInit();
//调试用指示灯
//对接收器的串口2配置
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
//配置PA2即USART2_TX_
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//配置PA3即USART2_RX
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//进行USART2的中断配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //优先级为第0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//配置USART2
/******************************************************
波特率为115200,字长为8,无奇偶校验位,终止位为1.
******************************************************/
USART_InitStructure.USART_BaudRate=9600;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(USART2,&USART_InitStructure);
//开USART2中断触发方式为接收中断
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//不能开IT-TXE中断使能,因为初始化时也会有TXE置位,因为此时发送数据寄存器为空
//使能USART2的时钟
USART_Cmd(USART2,ENABLE);
//清除USART2的发送结束标志位,以免第一个字符发送不出去
USART_ClearFlag(USART2,USART_FLAG_TC);
//串口2设置完成
}
求助啊?那里有问题呢,如何用一个串口双向通信呢???
|