在C中,我有一个数组等待从传感器接收字节,保存在缓冲区中,然后像这样打印出来:
unsigned char responseFrame[300];
int main(void) {
UART_init();
while(1) {
receive(responseFrame);
myLog(responseFrame, sizeof(responseFrame));
}
}
我通过以下操作填充数组:
void receive(unsigned char *rcv_buff) {
uint8_t recv_data;
for (int i=0; i<300; i++){
USART1_Flush();
rcv_buff[i] = USART1_RX();
}
}
然后我用以下方法打印出缓冲区中的内容:
// Logs this output to the serial port; used for debugging
void myLog(unsigned char *msg, int size) {
for (int i=0; i<size; i++) {
USART0_TX(msg[i]);
}
}
这会打印出数组,但当接收到另一次字节迭代时,所有内容都会被附加,所以假设我首先接收{0xFF,0xFF},第一次迭代的输出是:
0xFF 0xFF, 0x00, 0x00 ... 0x00
但在下一次迭代中,假设接收到{0x0A,0x0A},在输出中,我看到的是:
0xFF, 0xFF, 0x0A, 0x0A, 0x00, 0x00 ... 0x00
注意:省略号只是说有更多的0x00被打印出来,直到我们基本上达到数组的大小。
为什么要从数组的开头进行追加而不是覆盖?
这是我的USART0_TX和USART1_RX函数:
void USART0_TX(uint8_t myData) {
// Wait if a byte is being transmitted
while( !(UCSR0A & (1<<UDRE0)) );
// Transmit data
UDR0 = myData;
};
uint8_t USART1_RX(void) {
// Wait until recv buffer is full
while( !(UCSR1A & (1<<RXC1)) );
// Return recvd data
return UDR1;
};
这是我用来刷新USART1 RX:的代码
//USART1 flush, clears USART1 buffer
void USART1_Flush( void )
{
unsigned char dummy;
while ( UCSR1A & (1<<RXC1) ) dummy = UDR1;
}
我相信名为"Flush"的函数实际上是一个"Poll"函数,用于查找要出现的字符(这是正常用法,请等待字符出现)。使用RXC1的逻辑显示为反转。试着看看这个看起来很专业的AVR驱动程序(就像你正在做的那样,它有一个民意调查选项):
usart.c
另一个评论良好的受访驱动程序(有很多评论的小驱动程序):avr-uart驱动程序