1

我正在尝试使用全局数组来存储我知道不会大于 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;
};
4

2 回答 2

0

您确定您的 LogOutput 函数正在传递有效数据吗?

这应该工作

unsigned char* data = responseFrame;
LogOutput(data,255);

另一个想法:

您是否正在运行带有任何优化的编译器?尝试关闭它们以查看问题是否消失。

此外,您可能需要考虑标记全局 volatile。

volatile char data[255];
于 2012-07-25T20:07:30.460 回答
0

您可能需要延迟 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 in MHz

参考:AVR LibC delay.h

于 2012-08-14T18:40:30.477 回答