2016-10-01 2 views
0

printf 기능을 사용하여 직렬 포트에서 문자를 인쇄하고 싶습니다. 나는이 2 게시물 12을 읽고, 그러나 I'am 확실하지 manip 이해하기 :printf를 직렬 포트로 다시 지정

가 말했다 년대 1st link에 :

는 printf와 기능을 사용하려면를 먼저 새 __FILE 구조체를 작성해야합니다. 이 구조체는 FILE 구조체와 함께 호출됩니다.

왜 내가 __FILE 구조체를 만들어야 만 하는가? 나는이 문장을 실제로 이해하지 못했다. 2nd link에서

는 우리가 또한 __stdout__stdin을 재정의해야했다 표준 I/O 라이브러리에서 분리를 완료하려면

말했다입니다. 이것들은 __FILE 구조의 선언 아래에있는 retarget.c 파일에서 찾을 수 있습니다.

이 2 개의 변수를 재정의하는 것은 컴파일 오류가 아니라 다시 정의하는 것입니다.

+0

을 - http://www.sparetimelabs.com/tinyprintf/tinyprintf.php

다시 언젠가 내 자신의 글에서 복사 -ps. 'dup2()'를 가지고 있습니까? 여러분의 플랫폼은'stdout'을위한 파일 기술자'1'을 사용하는 리눅스와 같이 "표준"'stdout' 파일 디스크립터 값을 갖고 있습니까? 그렇다면'int fd = open ("/ path/to/port"...); dup2 (fd, STDOUT_FILENO);'. 'stdout' 버퍼링을 비활성화 할 수 있습니다. –

+0

아마도 freopen이 당신에게 유용 할 수 있습니다. – JohnTortugo

+0

피드백을 주셔서 감사합니다, @ undrewstand 'printf'는'fputc'를 사용하여 screen에 caracter를 표시하므로'printf' 함수 어딘가에'fputc (stdout, car)'호출이 있습니다. 만약 우리가 복사 된 stdout fd를 가지고 있다면,'car'도 새로운 fd (dup에 의해 생성 된)에 printd 될 것입니다. 그렇다면 어떤 일이 발생합니까? – Mouin

답변

1

이 가능 How to make printf work on STM32F103?

의 중복 어쨌든, 너무 여기에 내가 위의 스레드에 게시 내 대답을 넣어 것입니다 수 있습니다.

자신의 printf 구현을 작성하는 것이 옵션이며 아마도 나에게 권장되는 옵션입니다. 표준 라이브러리 구현에서 영감을 얻어 자신의 버전을 작성하십시오. 요구 사항 만 충족하면됩니다. 일반적으로, 당신이해야 할 일은, 먼저 시리얼 인터페이스를 통해 chars를 보내기위한 putc 함수를 retarget하는 것입니다. 그런 다음 putc 사용자 지정 구현을 사용하여 printf 메서드를 재정의합니다. 아마도, 아주 간단한 접근법은 putc 함수에 대한 재귀 호출에 의해 문자열을 문자 단위로 전송하는 것입니다.

가벼운 printf 구현을 찾아 볼 수 있습니다. 이 경량 구현물이 제공하는 코드 크기와 기능 세트는 사용자 정의 작성된 printf 기능과 주식 표준 인쇄 기능 (일명 짐승) 사이에 있습니다. 최근에 이것을 시도해 보았고 메모리 풋 프린트와 필요한 실행주기의 측면에서 ARM 코어의 성능에 매우 만족해했습니다. 확인을 할 수있는 어려운 길처럼 보인다 http://mycola.info/2015/02/09/lightweight-printfscanf-for-embedded-applications/

관련 문제