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

USART0_TX 関数に遅延を入れる必要があるかもしれません。

// Wait if a byte is being transmitted
while( !(UCSR0A & (1<<UDRE0)) );
// Transmit data
UDR0 = myData;
_delay_ms(250);

これにより、uC はバスに送られるデータに追いつくことができます。私はデータの送信で同様の問題に遭遇しましたが、UDR にデータを配置した後、短い遅延を使用すると問題が解決することがわかりました。

getData 関数で機能する理由は、他の 2 つのステートメントが TX 関数に関して遅延として機能するためです。

まだ util/delay.h を含めていない場合は、含める必要があります。最大遅延は 4294967.295 ms/ F_CPU (MHz) であることに注意してください。

参照: AVR LibC delay.h

于 2012-08-14T18:40:30.477 に答える
0

LogOutput 関数に有効なデータが渡されていますか?

これはうまくいくはずです

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

別の考え:

最適化を行ってコンパイラを実行していますか? それらをオフにして、問題が解決するかどうかを確認してください。

また、グローバルな揮発性をマークすることを検討することもできます。

volatile char data[255];
于 2012-07-25T20:07:30.460 に答える