keil 속 소란스러운 printf

2870 단어 단편기
오늘은 호 형의 무심결에 이야기했다.keil의 printf 함수를 언급했을 때 충격을 받았고 keilC51은 printf를 사용할 수 있었다.바로 구글 일파, 정말 있다!!!그야말로소감을 나누자!
참고: 함수를 직접 호출할 때는 UART를 초기화할 때 TI를 1로 설정해야 합니다.
#include 
#include 

void ConfigUART(unsigned int baud);

void main()
{
    ConfigUART(9600);
    while(1)
    {
        printf("Hello World
"
); } } void ConfigUART(unsigned int baud) { SCON = 0X50; TMOD &= 0x0F; TMOD |= 0x20; TH1 = 256 - (11059200/12/32)/baud; TL1 = TH1; TR1 = 1; TI = 1; }

원리: 그 밑바닥은putchar 함수를 호출하여 이루어진 것이고 작업 방식은 중단된 것이다.그래서 단점이 생겼다. 이 함수는 호출이 중단되면 전복된다.
keil에서 printf는 기본적으로 직렬로 데이터를 보내기 때문에 이 함수를 적용하려면 직렬을 초기화해야 합니다. 그렇지 않으면 다운될 수 있습니다. 그리고 printf에 앞서 TI를 위치를 설정해야 합니다. 베끼는 이유는 다음과 같습니다.
1. printf 함수는putchar 함수를 호출하여 입력한 것이고putchar은ti가 1인지 아닌지를 먼저 판단하고 1이 아니면 1을 기다려야 한다.1이면 0을 지우고 문자를 보냅니다.따라서 printf 함수를 직접 사용하면 프로그램은putchar 함수에서ti가 1이 되기를 기다립니다.이때 너의 프로그램은 바로 죽는 것과 같다.너는 putchar 함수를 고쳐서 자신의 목적을 실현할 수 있다.TI는 초기화
2. Keil의 직렬 처리는 비교적 교묘하다. 나의 분석은 다음과 같다:putchar.c에서는 TI를 체크하고 보냅니다.이렇게 하는 목적은 가능한 한 많은 시간을 두 번의 직렬 조작 사이의 프로그램에 남기는 것이지, 바이트가 발송되기를 기다리는 시간을 헛되이 낭비하는 것이 아니다.그러므로 시스템을 초기화할 때 반드시 TI=1을 시켜야 한다.printf 함수를 원활하게 사용할 수 있습니다.sbuf="의 방법은 사실TI=1. 그리고 특히 주의해야 할 것은 printf 함수가 실행된 후에 마지막 바이트가 발송되지 않았다. 예를 들어 485 통신에서 이때 수신 모드로 전환하면 마지막 바이트를 잃어버릴 수 있다.
3. 일반적으로 직렬 송신은 TI(바이트 송신 로고)가 1이면 바로 다음 바이트를 송신한다. TI로고를 끊든 조회하든 TI를 감지하기 때문에 첫 번째 송신은 반드시 TI로고를 배치해야 한다. 직렬 송신은'프로그램의 초기화 부분에서 직렬 데이터 레지스터 SBUF에 문자를 넣어서 터미널 디스플레이를 사용한다'는 메시지를 보내기 시작한다.방법의 최종 작용은 바로 TI를 1로 설정하고 TI=1로 바꾸는 것이다.발송을 시작하는 것도 마찬가지다.
4.stdio에서 정의하고, 밑바닥의putchar () 를 호출해서 실행합니다.밑에서 직렬 포트로 데이터를 보낼 때 TI=1이 성립되었는지 확인하고 TI=1이 될 때까지 기다린 다음 새 데이터를 SBUF에 쓰고 함수가 되돌아오기 때문에 먼저 TI를 1로 설정하고 첫 번째 전송 작업을 시작해야 한다.어셈블리 관련 코드를 보고 그 작업의 이치를 이해할 수 있습니다!
5. 자기 이해: 멀티플렉스 통신에서도putchar() 함수와 같은 기리를 형성해야 한다. 직렬로 서비스 프로그램을 중단하고 이 프로그램에서 TI를 판단해야 한다. TI가 다음 데이터를 보내야 하는지 아닌지에 따라~ 수신한 측에 대해서도...
달리
소프트웨어 디버깅만 하면 보트율과는 무관하다.타이머 T1을 구성하지 않을 수 있습니다.스튜디오 하나만 추가하면 돼요.h의 헤더 파일 및 TI=1 이 명령은

좋은 웹페이지 즐겨찾기