AVR USART通讯

时间:2018-04-18 09:57:53

标签: c arduino avr usart

我正在AVR微控制器上实现USART通信。以下是我的代码。此刻,我可以发送一个角色,发送一个字符串并接收一个角色。我有一个接收字符串的方法。

该方法名为hello,并返回我收到的字符串的地址。这是保存字符串h的55元素char数组。但是,例如,当我将单词#include <avr/io.h> #include <util/delay.h> #include <string.h> #include <avr/interrupt.h> // macro definition #define bit(n) (1 << n) // bit #define sbit(v, n) v |= (1 << n) // set bit #define cbit(v, n) v &= !(1 << n) // clear bit #ifndef F_CPU #define F_CPU 16000000 #endif #define BAUD 9600 // baud rate #define M_UBRR ((F_CPU/16/BAUD)-1) //contents of UBRRnH and UBRRnL registers // function prototypes void usart_init(); void send_char(char); void send_string(char*); char receive_char(); char* receive_string(); char string[55]; int main() { usart_init(); char* msg = receive_string(); sei(); while (1) { send_string(msg); _delay_ms(1000); } return 0; } void usart_init() { UBRR0H = (M_UBRR >> 8); // setting baud rate UBRR0L = M_UBRR; UCSR0B = (1 << TXEN0) | (1 << RXEN0) | (1 << RXCIE0); // enable transmitter and receiver UCSR0C = (1 << USBS0); // 2 stop bit UCSR0C = (1 << UCSZ00) | (1 << UCSZ01); } void send_char(char byte) { while (!(UCSR0A & (1 << UDRE0))); // wait until the register is empty UDR0 = byte; // put a char in the UDR0 register } void send_string(char* string) { int i; int len = strlen(string); for (i = 0; i < len; i++) { send_char(string[i]); } } char receive_char() { while (!(UCSR0A & (1 << RXC0))); // wait until all data in receive buffer is read return UDR0; } char* receive_string() { char x; int len = strlen(string); int i = 0; while (i < len) { x = receive_char(); string[i++] = x; } string[len] = '\0'; return (string); } 发送到微控制器时,此方法仅返回第一个字符{{1}}。我做错了什么?

{{1}}

1 个答案:

答案 0 :(得分:1)

代码中的

strlen(string)没有意义。如何获得尚未发送的字符串的长度?

将其更改为len = 55len = sizeof(string)

在C中,strlen计算找到零终止符之前的字符数。