一帧数据能分两次用HAL_UART_Receive接收吗
最近在做串口升级官方例程 有一段代码一帧数据分两次用HAL_UART_Receive接收 可是我这样调试 得不到数据 请教大神!一种基于HAL+UART+DMA环形队列接收数据实现方法 void Get_ID_command_Function(uint8_t *PID)
{
uint8_t Number=0,temp;
temp=Get_ID_command;
temp=0xFF-Get_ID_command;
while(HAL_UART_Transmit(&huartx,temp,2,TimeOUT_USART)!=HAL_OK){}
while(HAL_UART_Receive(&huartx,&temp,1,TimeOUT_USART)!=HAL_OK){}
switch(temp){
case ACK_MCU:
while(HAL_UART_Receive(&huartx,&Number,1,TimeOUT_USART)!=HAL_OK){}
//for(i=0;i<Number+1;i++)
while(HAL_UART_Receive(&huartx,PID,Number+1,TimeOUT_USART)!=HAL_OK){}
while(HAL_UART_Receive(&huartx,temp,1,TimeOUT_USART)!=HAL_OK){}
// printf("Get_ID ACK 1\n");
if(temp==ACK_MCU){
// LED(ON);
// printf("Get_ID ACK 2\n");
}else{
// LED(OFF);
printf("Get_ID NACK 2\n");
}
break;
case NACK_MCU:
printf("Get_ID NACK 1\n");
break;
default:
break;
}
} 你好 !你这样能调通? 如果有一个while超时 代码就会死循环啊。 static HAL_StatusTypeDef ReceivePacket(uint8_t *p_data, uint32_t *p_length, uint32_t timeout)
{
uint32_t crc;
uint32_t packet_size = 0;
HAL_StatusTypeDef status;
uint8_t char1;
*p_length = 0;
status = HAL_UART_Receive(&UartHandle, &char1, 1, timeout);
if (status == HAL_OK)
{
switch (char1)
{
case SOH:
packet_size = PACKET_SIZE; //128
break;
case STX:
packet_size = PACKET_1K_SIZE;//1024
break;
case EOT:
break;
case CA:
if ((HAL_UART_Receive(&UartHandle, &char1, 1, timeout) == HAL_OK) && (char1 == CA))
{
packet_size = 2;
}
else
{
status = HAL_ERROR;
}
break;
case ABORT1:
case ABORT2:
status = HAL_BUSY;
break;
default:
status = HAL_ERROR;
break;
}
*p_data = char1;
if (packet_size >= PACKET_SIZE )
{
status = HAL_UART_Receive(&UartHandle, &p_data, packet_size + PACKET_OVERHEAD_SIZE, timeout);//这里超时 收不到数据
/* Simple packet sanity check */
if (status == HAL_OK )
{
if (p_data != ((p_data) ^ NEGATIVE_BYTE)) // 有问题了
{
packet_size = 0;
status = HAL_ERROR;
}
else
{
/* Check packet CRC */
crc = p_data[ packet_size + PACKET_DATA_INDEX ] << 8;
crc += p_data[ packet_size + PACKET_DATA_INDEX + 1 ];
if (HAL_CRC_Calculate(&CrcHandle, (uint32_t*)&p_data, packet_size) != crc )
{
packet_size = 0;
status = HAL_ERROR;
}
}
}
else
{
packet_size = 0;
}
}
}
*p_length = packet_size;
return status;
}
串口发送一帧数据下来只能收到第一个字节第二个HAL_UART_Receive就超时了 求解 yimingliang2019 发表于 2019-6-26 15:06
你好 !你这样能调通? 如果有一个while超时 代码就会死循环啊。 static HAL_StatusTypeDef ReceivePacket( ...
波特率多少?数据位?校验?
yimingliang2019 发表于 2019-6-26 15:06
你好 !你这样能调通? 如果有一个while超时 代码就会死循环啊。 static HAL_StatusTypeDef ReceivePacket( ...
huart3.Init.BaudRate = 115200;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.WordLength = UART_WORDLENGTH_9B;
huart3.Init.Parity = UART_PARITY_EVEN; songshiqun2010 发表于 2019-6-26 16:31
波特率多少?数据位?校验?
我的是115200 8 N 1我真的调不通方便留个QQ吗 yimingliang2019 发表于 2019-6-27 09:01
我的是115200 8 N 1我真的调不通方便留个QQ吗
改成 115200 9 even 1 啊。GD32f103 GD32F303 上验证过 OK. yimingliang2019 发表于 2019-6-26 15:06
你好 !你这样能调通? 如果有一个while超时 代码就会死循环啊。 static HAL_StatusTypeDef ReceivePacket( ...
你解决没?我也遇到同样的问题。 怎么都查不出原因。
页:
[1]