首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >USART格式数据类型

USART格式数据类型
EN

Stack Overflow用户
提问于 2017-04-23 20:14:28
回答 2查看 1.2K关注 0票数 0

我想问,我如何通过usart作为整数发送数据,我指的是存储数字的变量。我能够发送char变量,但是终端显示了这个数字的表示,我需要看到数字。我编辑的代码如下所示,但它给了我错误:“‘USART_Transmit’的冲突类型”

代码语言:javascript
复制
#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;
}

你有什么想法吗?我希望你能理解我想解释的是什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-23 20:35:24

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

在你的文件顶部,放:

代码语言:javascript
复制
#include <stdio.h>

然后用这样的函数编写一些代码:

代码语言:javascript
复制
char buffer[16];
sprintf(buffer, "%d\n", number);
char * p = buffer;
while (*p) { USART_Transmit(*p++); }

前两行在缓冲区中构造一个以空结尾的字符串。最后两行是一个简单的循环,用于发送缓冲区中的所有字符。我在格式字符串中添加了一个换行符,以便更容易地查看一个数字的结束位置和另一个数字的起始位置。

票数 0
EN

Stack Overflow用户

发布于 2017-04-23 20:52:38

从技术上讲,UART串行连接只是一组比特流,它们被划分成一定长度的符号。完全有可能以原始形式发送数据,但这需要解决一些问题:

  • 如何明确地识别传输的开始和结束?
  • 如何处理连接双方的恩典?
  • 如何以健壮的方式序列化和反序列化数据?
  • 如何处理传输错误?

到头来,您永远无法解决所有的歧义和二进制数据必须转义或以其他方式编码,以防止误解。

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

  • STX / 0x02 /开始文本
  • ETX / 0x03 /文本结尾

还有其他控制字符,它们构成一个相当完整的集合来组成数据结构;为此您不需要JSON或XML。然而,ASCII本身确实支持传输任意二进制数据。然而,在很长一段时间里,这项任务的标准主要是base64编码。用于传输任意二进制数据。

您可能根本不应该以二进制方式传输数字;只需将数字推开;如果您使用的是八进制或十六进制数字,将其解析为整数是非常简单的(归结为一串位掩蔽和移位)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43575986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档