2017-04-23 155 views
0

我想問一下,我如何通過usart作爲整數發送數據,我的意思是存儲數字的變量。我能夠發送字符變量,但終端顯示我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; 
} 

你有任何想法有什麼不對嗎? PS:我希望你明白我想說明什麼。

回答

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它的作品!謝謝 – Branis

0

從技術上講,UART串行連接只是一個比特流,被劃分爲一定長度的符號。完全有可能以原始形式發送數據,但這帶來了一些必須解決的問題:

  • 如何明確識別傳輸的開始和結束?
  • 如何處理連接任何一方的永久性?
  • 如何以可靠的方式序列化和反序列化數據?
  • 如何處理傳輸錯誤?

在一天結束時,事實證明,你永遠無法解決所有的ambiguties和二進制數據必須以某種方式逃脫或以其他方式編碼,以防止誤解。

至於劃定傳輸而言,已經由ASCII標準的創造者通過一系列的非打印控制字符處理:利益對你應該是特殊控制字符

  • STX/0x02文本/啓動
  • ETX/0x03 /文本結束

還存在形成其他控制字符相當完整的組合構成數據結構;你不需要JSON或XML。然而ASCII本身確實支持任意二進制數據的傳輸。然而,這項任務很長一段時間的標準釘書針一直是並且是base64編碼。用它來傳輸任意的二進制數據。

你可能不應該用二進制傳輸的數字;只是推動數字;如果你使用八進制或十六進制數字解析爲整數是非常簡單的(歸結爲一堆位掩碼和移位)。