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
编码。用它来传输任意二进制数据。
您可能根本不应该以二进制形式传输的数字;只是把数字推来推去;如果您使用八进制或十六进制数字解析为整数非常简单(归结为一堆位掩码和移位)。
我想问一下,我如何通过 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
编码。用它来传输任意二进制数据。
您可能根本不应该以二进制形式传输的数字;只是把数字推来推去;如果您使用八进制或十六进制数字解析为整数非常简单(归结为一堆位掩码和移位)。