2017-04-23 62 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编码。用它来传输任意的二进制数据。

你可能不应该用二进制传输的数字;只是推动数字;如果你使用八进制或十六进制数字解析为整数是非常简单的(归结为一堆位掩码和移位)。

相关问题