C++ C/C+中的数组+;因为AVR一直在追加
在C中,我有一个数组等待从传感器接收字节,保存在缓冲区中,然后像这样打印出来:C++ C/C+中的数组+;因为AVR一直在追加,c++,c,global-variables,avr,C++,C,Global Variables,Avr,在C中,我有一个数组等待从传感器接收字节,保存在缓冲区中,然后像这样打印出来: unsigned char responseFrame[300]; int main(void) { UART_init(); while(1) { receive(responseFrame); myLog(responseFrame, sizeof(responseFrame)); } } 我通过执行以下操作填充阵列: void receive(unsigned
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]);
}
}
但是在下一次迭代中,假设接收到{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;
};
void USART0\u TX(uint8\u t myData){
//如果正在传输字节,请等待
虽然(!(UCSR0A&(1我相信你的函数名为“Flush”实际上是一个“Poll”函数,寻找要出现的字符(这是正常用法,等待字符出现)。你使用RXC1的逻辑看起来是相反的。试着看看这个看起来相当专业的AVR驱动程序(它和你正在做的一样有一个Poll选项):
另一个评论很好的民意调查驱动程序(很小,有很多评论):我对AVR了解不多,但可能USART1_RX
背后的数据是缓冲的,不会自动刷新。这意味着在刷新之前,您只需再次读取相同的数据,并附加任何新数据。正如smocking指出的,情况很可能是这样。另外,如果您使用现代编译器,volatile关键字不需要,因为编译器很可能会忽略它,关键字寄存器也是如此。为什么要编写&responseFrame[0]
?responseFrame
也可以,可以阅读。你从哪里得到关于USART1_RX的文档?从我看来,这是一个中断向量,不是你应该轮询的东西,除非你在幕后做了一些奇怪的事情。@Justin USART1_RX只是一个自定义函数,我正在调用ge我已经编辑了这个问题,把它包括在上面。
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 flush, clears USART1 buffer
void USART1_Flush( void )
{
unsigned char dummy;
while ( UCSR1A & (1<<RXC1) ) dummy = UDR1;
}