问题描述:
主机发送 0x55 0x04 0x02 0x06 这4个字节的数据,但是从机每次进串口中断都检查到会溢出错误标志位
并且主机发送一帧数据下面从机也只收到 0x55 0x02这两个数据。
通信方式是rs232,波特率是9600,用示波器看了波形很好,可以排除硬件故障
/****************************
*名称: void USART_Config(USART_TypeDef* USARTx)
*功能: 初始化串口
*入口参数: 串口号
*出口参数: 无
*说明: 填入需要配置的串口号即可配置该串口的参数
*调用方法: 无
*****************************/
void USART_Config(USART_TypeDef* USARTx,u32 baud){
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = baud; //速率9600bps
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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(USARTx, &USART_InitStructure); //配置串口参数函数
USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); //使能接收中断
USART_DMACmd(USARTx,USART_DMAReq_Tx,ENABLE);
/* Enable the USARTx */
USART_Cmd(USARTx, ENABLE);
}
void USART3_IRQHandler(void)
{
if(USART_GetFlagStatus(USART3,USART_FLAG_ORE)==SET)
{
USART_ClearFlag(USART3,USART_FLAG_ORE);
if(count<50)
rxb[count++]= USART_ReceiveData(USART3);
else
count = 0;
}
if(USART_GetFlagStatus(USART3,USART_FLAG_NE)==SET)
{
USART_ClearFlag(USART3,USART_FLAG_NE);
USART_ReceiveData(USART3);
}
if(USART_GetFlagStatus(USART3,USART_FLAG_FE)==SET)
{
USART_ClearFlag(USART3,USART_FLAG_FE);
USART_ReceiveData(USART3);
}
if(USART_GetITStatus(USART3, USART_FLAG_RXNE) == SET) //判断读寄存器是否非空
{
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
// Read one byte from the receive data register
RxBuf[RxCounter++]= USART_ReceiveData(USART3);
if(RxBuf[0] != 0x55) //帧头不对
RxCounter = 0;
if(RxCounter>=4 && RxBuf[1]==RxCounter)//接收完毕
{
// RxBuf[0]=0;
RxCounter=0;
Rx** = 1; //置位接收标志位
}
}
if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)
{
USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
}
}
|