新手上路
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2020-12-23
- 在线时间
- 5 小时
|
5金钱
这是我的初始化代码。其中通过UART4和串口迪文屏通信(485通信),在调试过程中发现单片机向迪文屏发送数据正常 但是接收不到迪文屏发送过来的数据
串口的初始化:
void USART2_Screen_Config(void )
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOA,D时钟
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用时钟,并不需要
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);//使能USART2时钟
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; //PD7端口配置
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_1);//进入发送模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC,&GPIO_InitStruct);
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_Mode = USART_Mode_Tx |USART_Mode_Rx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(UART4,&USART_InitStruct);
USART_Cmd(UART4,ENABLE);
USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
USART_ITConfig(UART4, USART_IT_ERR, ENABLE);
// 如下语句解决第1个字节无法正确发送出去的问题
USART_ClearFlag(UART4, USART_FLAG_TC); // 清标志
}
串口发送函数:
void USART2_Send_Screen_Cmd(uint8_t *table,uint8_t counter)
{
u8 i = 0;
GPIO_SetBits(GPIOA,GPIO_Pin_1); //进入发送模式。
for(i = 0;i <= counter ;i++)
{
Uart2_send_buff[i] = table[i];
}
/***串口中断发送一定长度的数据***/
Uart2_send_counter = counter+1;//一共多少个字节,好好计算下,这里要8+1.以后考虑一下。
Uart2_send_pointer = Uart2_send_buff;
USART_SendData(UART4, *Uart2_send_pointer++);
// 这里的话如果发的命令是 0x83类型的 那迪文屏就会返回需要的数据(通过中断)
// 这玩意通过中断发的?
USART_ITConfig(UART4, USART_IT_TXE, ENABLE);
}
串口中断处理函数:
void UART4_IRQHandler(void)
{
// 这里的话因为串口2的收发挺频繁的 所以USART_GetFlagStatus(USART2, USART_FLAG_ORE)不能完全解决问题
// 要不然你调试会发现 卡死在内个ORE的判断里了
if (USART_GetFlagStatus(UART4, USART_FLAG_ORE) != RESET)
{
LED1=0;
USART_ReceiveData(UART4);
USART_ClearFlag(UART4, USART_FLAG_ORE);
}
if (USART_GetFlagStatus(UART4, USART_FLAG_FE) != RESET)
{
USART_ReceiveData(UART4);
USART_ClearFlag(UART4, USART_FLAG_FE);
} //
if(USART_GetFlagStatus(UART4, USART_FLAG_PE) != RESET)
{
USART_ReceiveData(UART4);
USART_ClearFlag(UART4, USART_FLAG_PE);
}
if(USART_GetITStatus(UART4,USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(UART4,USART_IT_RXNE);
Uart2_rev_buff[Uart2_rev_count++]= USART_ReceiveData(UART4);
if(USART_ReceiveData(UART4) == 0xff)//偶尔出现0xff情况
{
Uart2_rev_count = 0;
}
if((Uart2_rev_buff[0] == 0x5A)&&(Uart2_rev_buff[1] == 0xA5))//接收到屏幕的指令
{
if(Uart2_rev_count >= 9)
{
//USART1_Send_Cmd(Uart2_rev_buff,8);
Uart2_rev_count = 0;
Uart2_rev_screen_comflag = 1;//屏幕接收完成
}
}
// 收到的消息不对 直接就不看了
if(Uart2_rev_count >=9)
{
Uart2_rev_count = 0;
}
//GPIO_WriteBit(GPIOD,GPIO_Pin_2,(BitAction)(1 - GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2)));
}
if(USART_GetITStatus(UART4, USART_IT_TXE) != RESET)
{
Uart2_send_counter--;
if(Uart2_send_counter>0)
{
USART_SendData(UART4, *Uart2_send_pointer++);
}
else
{
unsigned char i = 0 ;
USART_ITConfig(UART4, USART_IT_TXE, DISABLE);
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //进入接收模式
for(i = 0;i <10; i++)
{
Uart2_send_buff[i] = 0;
}
}
}
}
|
|