27,374
社区成员
我是用hal库,cubeMX生成的代码。同样出现重复接收到首位
如发送: $SrR3t,R02.7,A*42
接收 : $$SrR3t,R02.7,A*42
uint8_t uart1_tx[] ="Hello world\r\n";
uint8_t uart1_Rx;
uint8_t uart1_R_data[30];
uint8_t uart1_R_Number;
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
* 要添加库
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/**
* 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fgetc(FILE * f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
return ch;
}
//这接收函数是自己添加,接收到一串以'$'开头,回车换行符结束的数据就打印出去。数据串长度不超过30个字节
从调试助手发送一串数据后,再接收到单片机返回调试助手的数据总是重复了一个'$',仿真也看到接收到的数据是重复接收了一个'$'
如发送: $SrR3t,R02.7,A*42
接收 : $$SrR3t,R02.7,A*42
void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart)
{
if(huart->Instance == USART1)
{
uart1_R_data[uart1_R_Number] = uart1_Rx;
if(uart1_R_data[uart1_R_Number]== 0x0A&& \
uart1_R_data[uart1_R_Number-1]==0x0D)//'\r'==0x0D '\n'==0x0A
{
if(uart1_R_data[0]=='$')
{
printf("%s",uart1_R_data);
}
uart1_R_Number =0;
}
uart1_R_Number++;
if(uart1_R_Number>29)
uart1_R_Number=0;
HAL_UART_Receive_IT(&huart1, &uart1_Rx, 1);//非堵塞接收;再次打开接收中断,以便下次继续接收
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
//
printf("%s",uart1_tx);
uart1_R_Number=0;
HAL_UART_Receive_IT(&huart1, &uart1_Rx, 1);//非堵塞接收
while (1)
{
/* USER CODE BEGIN 3 */
HAL_Delay(200);
}
/* USER CODE END 3 */
}