我想问,我如何通过usart作为整数发送数据,我指的是存储数字的变量。我能够发送char变量,但是终端显示了这个数字的表示,我需要看到数字。我编辑的代码如下所示,但它给了我错误:“‘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;
}你有什么想法吗?我希望你能理解我想解释的是什么。
发布于 2017-04-23 20:35:24
我喜欢用sprintf格式化序列号。
在你的文件顶部,放:
#include <stdio.h>然后用这样的函数编写一些代码:
char buffer[16];
sprintf(buffer, "%d\n", number);
char * p = buffer;
while (*p) { USART_Transmit(*p++); }前两行在缓冲区中构造一个以空结尾的字符串。最后两行是一个简单的循环,用于发送缓冲区中的所有字符。我在格式字符串中添加了一个换行符,以便更容易地查看一个数字的结束位置和另一个数字的起始位置。
发布于 2017-04-23 20:52:38
从技术上讲,UART串行连接只是一组比特流,它们被划分成一定长度的符号。完全有可能以原始形式发送数据,但这需要解决一些问题:
到头来,您永远无法解决所有的歧义和二进制数据必须转义或以其他方式编码,以防止误解。
就传输的划界而言,ASCII标准的创建者通过一组不可打印的控制字符已经解决了这一问题:您感兴趣的应该是特殊的控制字符。
STX / 0x02 /开始文本ETX / 0x03 /文本结尾还有其他控制字符,它们构成一个相当完整的集合来组成数据结构;为此您不需要JSON或XML。然而,ASCII本身确实支持传输任意二进制数据。然而,在很长一段时间里,这项任务的标准主要是base64编码。用于传输任意二进制数据。
您可能根本不应该以二进制方式传输数字;只需将数字推开;如果您使用的是八进制或十六进制数字,将其解析为整数是非常简单的(归结为一串位掩蔽和移位)。
https://stackoverflow.com/questions/43575986
复制相似问题