USART 格式数据类型

USART format data type

我想问一下,我如何通过 usart 发送整数数据,我的意思是存储数字的变量。我能够发送 char 变量,但终端向我显示了这个数字的 ascii 表示,我需要查看数字。 我编辑了如下所示的代码,但它给了我错误:"conflicting types for 'USART_Transmit'"

#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: 希望你明白我要解释的内容。

我喜欢使用 sprintf 来格式化序列号。

在文件的顶部,输入:

#include <stdio.h>

然后像这样在函数中写一些代码:

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

前两行在缓冲区中构造一个以 null 结尾的字符串。最后两行是发送缓冲区中所有字符的简单循环。我在格式字符串中放了一个换行符,以便更容易看出一个数字在哪里结束,另一个数字在哪里开始。

从技术上讲,UART 串​​行连接只是将比特流分成一定长度的符号。以原始形式发送数据是完全可能的,但这会带来许多必须解决的问题:

  • 如何明确地识别传输的开始和结束?
  • 如何处理连接两端的字节顺序?
  • 如何以稳健的方式序列化和反序列化数据?
  • 如何处理传输错误?

最终证明,您永远无法解决所有歧义,必须以某种方式对二进制数据进行转义或编码以防止误解。

就定界传输而言,ASCII 标准的创建者已通过不可打印的控制字符集解决了这个问题:您应该感兴趣的是特殊控制字符

  • STX / 0x02 / 文本开头
  • ETX / 0x03 / 文本结束

还有其他的控制字符组成一个比较完整的集合来组成数据结构;为此,您不需要 JSON 或 XML。然而 ASCII 本身确实支持任意二进制数据的传输。然而,长期以来这项任务的标准主要内容一直是​​ base64 编码。用它来传输任意二进制数据。

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