2017-04-23 5 views
0

私はusart経由でデータを整数として送信する方法を教えてください。数値を格納する変数を意味します。私はchar変数を送信することができますが、ターミナルは私にこの番号のasciiプレゼンテーションを表示し、番号を見る必要があります。 、以下に示すように私は、コードを編集したが、それは私にエラーを与える: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; 
} 

「『USART_Transmit』の競合の種類は、」あなたは何が間違っている任意のアイデアを持っていますか? PS:説明しようとしていることを理解していただければ幸いです。

答えて

0

sprintfを使用してシリアル番号をフォーマットしたいのですが。あなたのファイルの先頭に

、置く:

#include <stdio.h> 

次に、このような関数ではいくつかのコードを記述します。

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

最初の2行はバッファ内のNULLで終わる文字列を構築。最後の2行は、バッファ内のすべての文字を送信する単純なループです。私は書式文字列に改行を入れて、ある数字がどこで終わり、もう一方の数字が始まるかを見やすくしました。

+0

私のコードは次のようになります:https://paste.ofcode.org/x2pAV3VaFYGJBzKyDXPyyr aaaand it!ありがとう – Branis

0

技術的には、UARTシリアル接続は、特定の長さのシンボルに分割されたビットストリームです。データを生のまま送信することは可能ですが、これには多くの問題があります。

  • トランスミッションの開始と終了を明確に識別する方法はありますか?
  • 接続のどちら側でもエンディアンを処理するにはどうすればよいですか?
  • データを堅牢な方法でシリアル化およびデシリアライズする方法はありますか?
  • 伝送エラーの処理方法は?

最後に、すべての曖昧さを解決することはできず、誤った解釈を避けるために、何らかの形でエスケープまたは他の方法でエンコードする必要があります。

限り送信を区切ることは懸念しているとして、印刷不可能な制御文字のセットを介してASCII標準のクリエイターによって対処されてきたもの:興味深いのは、特別な制御文字でなければなりませんため

  • STX/0x02テキスト

のテキスト

  • ETX/0x03 /終了の/スタート形成する他の制御文字もあります。データ構造を構成するかなり完全なセット。このためにJSONやXMLは必要ありません。しかし、ASCII自体は任意のバイナリデータの送信をサポートしています。しかし、長い間、この仕事の標準的なステープルは、base64エンコーディングです。任意のバイナリデータの送信に使用します。

    数字は、おそらくバイナリでは送信しないでください。ちょうど周りの数字を押す。整数にパースする8進数または16進数を使用している場合は、非常にシンプルです(ビットマスキングとシフトの束になっています)。

  • 関連する問題