阿麥Mai 2023-03-20 20:32 采纳率: 57.1%
浏览 76
已结题

stm32串口传输乱码是为什么?

int main(void)
{
    uint16_t Buf[2] = {0};
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_ADCEx_Calibration_Start(&hadc1);
  HAL_ADC_Start_DMA(&hadc1, (uint32_t * )Buf, 2);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      printf("ADC1=%d\n\r", Buf[0]);
      HAL_UART_Transmit(&huart1, Buf, sizeof(Buf), 10000);
      HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}

img

  • 写回答

3条回答 默认 最新

  • qllaoda 2023-03-21 09:42
    关注

    因为你的串口传输的是原始数值,而数值对应的ascii码一般都不是可显示字符,即使可显示也不是你想要的,所以当然就是“乱码”,你也说了hex模式是正常的,那自然就不是文本了,接收显示用文本模式当然就是乱码了。
    说到底还是C语言基础没学好,没搞清字符和数值的区别和联系。
    如果你希望传输文本,建议你先把数值转换成对应的文本字符串,可以用sprintf转换
    比如
    char dispbuf[100]
    sprintf(disbuf, "%d", buf[0]);
    HAL_UART_Transmit(&huart1, dispbuf, strlen(dispbuf), 10000);
    当然,如果print重定向好了,也可以直接用printf格式化输出

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月23日
  • 已采纳回答 3月21日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事: