STM32CubeIDE는 printf를 직렬 포트로 리디렉션
9947 단어 단편기
/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
PUTCHAR_PROTOTYPE
{
// &huart1, cubemx 1
HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
return ch;
}
#endif
/* USER CODE END 0 */
위의 방법은 이전 버전에서 실행할 수 있다.현재의 버전은 업그레이드된 후에 바뀌었다.다시 써야 함write 함수.한참을 해내다가 결국 납득하였다.이 대신의 가르침에 감사 드립니다https://blog.csdn.net/kyzb002/article/details/101100922
직렬 포트를 어떻게 설정했는지 상세하게 설명하지 않겠습니다.메일에서만c 파일에서USER CODE BEGIN 0 사이에 아래 코드를 추가하면 인터넷에 있는 글은 두 번째 함수만 적습니다io_putchar은 다시 정의해야 한다고 쓰지 않았어요write 함수, 여기는 두 함수 모두 반드시 실현해야 합니다.attribute((weak))의 작용은 약함수write 함수는syscalls에 있습니다.c에서 사용weak 정의, 그래서 다른 파일에서 직접 정의할 수 있습니다write 함수
이전에 을 다시 쓰기만 하면 됩니다.io_putchar 함수는 실행할 수 있습니다. stdio 때문일 것 같습니다.h안의 코드가 바뀌었다.
/* USER CODE BEGIN 0 */
#include "stdio.h"
// print start
int __io_putchar(int ch)
{
// USART1
while ((USART1->SR & 0X40) == 0); // ,
USART1->DR = (uint8_t) ch;
return ch;
}
//_write syscalls.c , __weak , _write
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar(*ptr++);
}
return len;
}
// print end
/* USER CODE END 0 */
또는 두 개를 하나의 함수로 합치다
/* USER CODE BEGIN 0 */
#include "stdio.h"
// print start
//_write syscalls.c , __weak , _write
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
while ((USART1->SR & 0X40) == 0); //
USART1->DR = (uint8_t) *ptr++;
}
return len;
}
// print end
/* USER CODE END 0 */
더 깔끔한 거.
/* USER CODE BEGIN 0 */
#include "stdio.h"
// printf start
//_write syscalls.c , __weak , _write
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
if(HAL_UART_Transmit(&huart1,ptr,len,0xffff) != HAL_OK)
{
Error_Handler();
}
}
// printf end
printf에서 부동점수% f를 지원하려면 설정을 열어야 합니다.아래 문장을 참고하시오https://blog.csdn.net/qq_42980638/article/details/98359026
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 출력 포인터 변수 주소(16진수)텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.