2017-04-23 2 views
0

나는 정수로 usart를 통해 데이터를 보낼 수있는 방법을 물어보고 싶습니다. 숫자를 저장하는 변수를 의미합니다. char 변수를 보낼 수 있지만 단말기는이 숫자의 ascii 표시를 보여 주므로 숫자를 볼 필요가 있습니다. 아래 그림처럼 코드를 편집하지만 나에게 오류를 제공합니다 : "에 대한 충돌 유형을 'USART_Transmit'" USART 형식 데이터 형식

#include <avr/io.h> 
#include <util/delay.h> 

#define FOSC 8000000// Clock Speed 
#define BAUD 9600 
#define MYUBRR FOSC/16/BAUD-1 

void USART_Init(unsigned int ubrr); 
void USART_Transmit(unsigned char data); 
unsigned char USART_Receive(void); 

int main(void) 
{ 
    unsigned char str[5] = "serus"; 
    unsigned char strLenght = 5; 
    unsigned int i = 47; 

    USART_Init (MYUBRR); 
    //USART_Transmit('S'); 
    while(1) 
    { 
     /*USART_Transmit(str[i++]); 
     if(i >= strLenght) 
     i = 0;*/ 
     USART_Transmit(i); 
     _delay_ms(250); 
    } 
    return(0); 
} 

void USART_Init(unsigned int ubrr) 
{ 
    /* Set baud rate */ 
    UBRR0H = (unsigned char)(ubrr>>8); 
    UBRR0L = (unsigned char)ubrr; 
    /* Enable receiver and transmitter */ 
    UCSR0B = (1<<RXEN)|(1<<TXEN); 
    /* Set frame format: 8data, 2stop bit */ 
    UCSR0C = (1<<USBS)|(3<<UCSZ0); 
} 

void USART_Transmit(unsigned int data) 
{ 
    /* Wait for empty transmit buffer */ 
    while (!(UCSR0A & (1<<UDRE))) 
    ; 
    /* Put data into buffer, sends the data */ 
    UDR0 = data; 
} 

unsigned char USART_Receive(void) 
{ 
    /* Wait for data to be received */ 
    while (!(UCSR0A & (1<<RXC))) 
    ; 
    /* Get and return received data from buffer */ 
    return UDR0; 
} 

당신이 무슨 어떤 생각을 가지고 있습니까? 추신 : 나는 무엇을 설명하려고하는지 이해하시기 바랍니다.

답변

0

sprintf을 사용하여 일련 번호를 포맷합니다.

파일의 상단에

넣어 :

#include <stdio.h> 

는 다음과 같은 기능에 몇 가지 코드를 작성 :

char buffer[16]; 
sprintf(buffer, "%d\n", number); 
char * p = buffer; 
while (*p) { USART_Transmit(*p++); } 

처음 두 줄은 버퍼에 널 종료 문자열을 만들 . 마지막 두 줄은 버퍼의 모든 문자를 보내는 간단한 루프입니다. 하나의 숫자가 끝나는 곳과 다른 쪽이 시작되는 곳을보기 쉽도록 형식 문자열에 개행 문자를 넣었습니다.

+0

내 코드는 다음과 같습니다. https://paste.ofcode.org/x2pAV3VaFYGJBzKyDXPyyr aaaand it! 감사 – Branis

0

기술적으로 UART 직렬 연결은 특정 길이의 기호로 분할 된 비트 스트림입니다. 데이터를 원시 형식으로 전송하는 것이 가능하지만 많은 문제가 있습니다.

  • 전송의 시작과 끝을 명확하게 식별하는 방법은 무엇입니까?
  • 연결의 양쪽에서 엔디안을 처리하는 방법은 무엇입니까?
  • 데이터를 강력하게 직렬화 및 비 직렬화하는 방법은 무엇입니까?
  • 전송 오류를 어떻게 처리합니까?

하루가 끝나면 모든 모호성을 해결할 수 없으며 오역을 방지하기 위해 이진 데이터를 이스케이프 처리하거나 달리 인코딩해야합니다.

지금까지 전송을 구분하는 것은 관한 한, 인쇄 할 수없는 제어 문자의 집합을 통해 ASCII 표준의 창조자에 의해 해결되어왔다 : 관심이 특수 제어 문자이어야한다 위해

  • STX/0x02 텍스트의 텍스트의/시작
  • ETX/0x03/종료도를 형성 다른 제어 문자가 있습니다

데이터 구조를 구성하는 꽤 완벽한 세트; 이를 위해 JSON 또는 XML이 필요하지 않습니다. 그러나 ASCII 자체는 임의의 2 진 데이터 전송을 지원합니다. 그러나 오랜 시간 동안이 작업에 대한 표준 스테이플은 base64 인코딩입니다. 임의의 바이너리 데이터를 전송할 때 사용하십시오.

숫자는 바이너리로 전송하면 안됩니다. 주변을 손가락으로 밀면됩니다. 정수로 파싱하는 8 진수 또는 16 진수를 사용하는 경우 매우 간단합니다 (비트 마스킹 및 전환).