最近在单片机实战项目中遇到一个问题,使用串口通信,采用一主多从MCU,让MCU之间能够通讯,并且数据包以8个字节为一组。
问题描述:当主机给MCU发送8位数据时,从MCU只能一个一个接收,当第一个数据被接收成功后,第二个数据才会再次触发中断,以此类推,直到第八个字节被成功接收,这样我的数据包接收就会存在问题。
例如:
主MCU想发送数据包: 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 给从MCU,但是从MCU触发一次串口中断只能接收一个数据,连续触发八次,直到0x80被成功接收,这样违背了代码初衷,整个数据包就不会被正确的解析,导致数据接收异常。
(1)做了很多实验,一开始在串口写下面的代码,但是接收到的数据仍然为一次只能接收一个
void UART_WriteData(UART_T *uart,uint8_t pu8TxBuf[],uint32_t u32WriteBytes)
{
uint8_t i;
for(i=0;i<8;i++)
{
UART_WRITE(uart,pu8TxBuf[i]);
}
}
(2)尝试在代码中加入printf函数进行打印数据,发现接收数据正常,能够接收到整个数据包。
void UART_WriteData(UART_T *uart,uint8_t pu8TxBuf[],uint32_t u32WriteBytes)
{
uint8_t i;
printf("Send data :");
for(i=0;i<8;i++)
{
UART_WRITE(uart,pu8TxBuf[i]);
printf(" %02X ",pu8TxBuf[i]);
}
printf("\n");
}
(3)尝试去掉printf,使用1ms延时函数,能够解决这个问题。
void UART_WriteData(UART_T *uart,uint8_t pu8TxBuf[],uint32_t u32WriteBytes)
{
uint8_t i;
System_Delay_ms(1);
for(i=0;i<8;i++)
{
UART_WRITE(uart,pu8TxBuf[i]);
System_Delay_ms(1);
}
}
总结:数据不能完整的接收发送,本质还是数据收发时序的影响导致,发送的时序过快导致接收不能正常接收,能够尝试进行使用合适的延时,能够有效的解决这个问题。