在 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;
}