[英]AVR C Programming - Global Arrays
我正在嘗試使用全局數組來存儲我知道不會大於255個字節的數據。 但是,當我嘗試使用數組傳輸數據時,似乎沒有任何傳輸。 我究竟做錯了什么?
char responseFrame[255];
int main {
...
while(1){
getData();
}
};
void getData(void) {
int responseLen = USART1_RX();
// put data in the response frame
for (int i = 0; i < responseLen; i++){
recv_data = USART1_RX();
responseFrame[i]=recv_data;
//USART0_TX(responseFrame[i]);
}
LogOutput(responseFrame, responseLen);
}
void LogOutput(char *msg, int size) {
int i;
for (i = 0; i < size; i++) {
USART0_TX(msg[i]);
}
}
但是,當我注釋我的日志記錄函數“ LogOutput”並使用“ USART0_TX(responseFrame [i])”行直接發送時,它將適當地發送信息。
這是我的USART0_TX函數:
void USART0_TX(uint8_t myData) {
// Wait if a byte is being transmitted
while( !(UCSR0A & (1<<UDRE0)) );
// Transmit data
UDR0 = myData;
};
您確定您的LogOutput函數正在傳遞有效數據嗎?
這應該工作
unsigned char* data = responseFrame;
LogOutput(data,255);
另一個想法:
您是否在對編譯器進行任何優化? 嘗試將其關閉以查看問題是否消失。
另外,您可能需要考慮標記全局揮發物。
volatile char data[255];
您可能需要延遲USART0_TX函數。
// Wait if a byte is being transmitted
while( !(UCSR0A & (1<<UDRE0)) );
// Transmit data
UDR0 = myData;
_delay_ms(250);
這將使uC能夠趕上總線上的數據。 我在傳輸數據時也遇到了類似的問題,我發現將數據放在UDR上后使用一小段延遲即可解決該問題。
之所以在您的getData函數中起作用,是因為其他兩個語句相對於TX函數而言是一個延遲。
如果還沒有,則需要包含util / delay.h。 請記住,最大延遲為4294967.295 ms / F_CPU以MHz為單位
參考: AVR LibC delay.h
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.