2011-09-15 2 views
0

デバイスをAtMega2560のUART0に接続しました。 UART0データをUART2に転送して、ターミナル(PC)で表示したいと思います。AtMega2560のUART0〜UART2ゲートウェイ(種類)

UARTからシリアルデバイス(FTDI)を使用してデバイスをPCに直接接続すると、データがうまく送信されます。

私は目的が言ったために途中でUART2を入れると、それだけで具体的には、最初の行を送信します。

Ver V2DAPV142 On-Line:そしてが忘れ。時にはそれも最初の行を送信しません。

コード:

#define UART0_BUFFER_SIZE 40 
#define RX_WAIT 65000 
volatile unsigned char UART0_rx_ArrUC85[UART0_BUFFER_SIZE]; 
volatile unsigned char UART0_rx_ArrLength = 0, UART0_rx_ArrIndex = 0; 

void uart0_init(unsigned int baudrate) 
{ 

    UBRR0H = (unsigned char) (baudrate>>8); 
    UBRR0L = (unsigned char) baudrate; 

    UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1<<RXCIE0); 
    UCSR0C = (1 << USBS0) | (1 << UCSZ01) | (1 << UCSZ00); // 8N1 

} 

void USART2Init(UINT16 ubrr_value) 
{ 
    UBRR2L = ubrr_value; 
    UBRR2H = (ubrr_value>>8); 

    UCSR2C|=(3<<UCSZ20); 

    UCSR2B = (1<<RXEN2) | (1<<TXEN2); 

} 
ISR(USART0_RX_vect) 
{ 
    unsigned char recChar = UDR0; 
    if (UART0_BUFFER_SIZE > UART0_rx_ArrLength) 
    {  
     UART0_rx_ArrUC85[UART0_rx_ArrIndex++] = recChar; 
     UART0_rx_ArrLength = UART0_rx_ArrIndex; 
    } 

} 

void uart2_putchar(UINT8 data) 
{ 
    //Local variables 
    unsigned int i; 
    for(i = 0; !(UCSR2A & (1 << UDRE2)); i++) // Wait for empty transmit buffer 
    { 
     if(i > RX_WAIT)       // How long one should wait 
     { 
      return ;        // Give feedback to function caller 
     } 
    } 
    UDR2 = data;         // Start transmitting  
    //return (int)data;        // Cast and return int value 
} 


void uart2_puts(unsigned char *str) 
{ 
    UINT8 dat; 
    for(;*str != '\0';) 
    { 
     dat= *str++ ; 
     uart2_putchar(dat); 
    } 

} 
int main() 
{ 
    USART2Init(8); 
    uart0_init(103); 
    sei(); 
    while(1) 
    {  
     if(UART0_rx_ArrLength>0) 
     { 
     uart2_puts((unsigned char *) UART0_rx_ArrUC85);  
     UART0_rx_ArrLength = UART0_rx_ArrIndex = 0;      
     } 
    } 
} 

何の問題である可能性があります。 UART0とUART2についても同じボーレートでチェックしました。

+0

あなたは両方のUARTを試しましたが、正しく動作しましたか?あなたは、PCにuart0を接続し、(例えば)hiperterminalでそれを試してから、uart2で同じことをする必要があります。両方とも動作するかどうか教えてください。 – webbi

+0

問題はすべてのソフトウェアではありませんでした。それはcktの電力レベルの問題でした。それが暑くなったら、UART#でデータを送信しません。今それは動作します。それを理解するために2日間かかった。私の仕事の圧力は、私がここでそれを更新することを許していない。 :|とにかく応答していただきありがとうございます..私は現在、 '磁力計の問題'アウトを考えています。参照してください:http://electronics.stackexchange.com/questions/21007/magnetometer-dynamic-calibration/21249#21249 – Rick2047

+0

偉大な!他の人がそれが解決されたことを知ってくれるように質問に答えることができるかもしれないと思います。ありがとう! – webbi

答えて

0

問題は回路の電力レベルでした。電源はPen-Drive制御には十分ではなく、レギュレータはその通信電力レベルの供給元にすることができませんでした。それゆえに時にはうまくいかなかった。さらに我々はそれをテストし、別の電源レギュレータを使用してペンドライブの制御装置に十分な電力を与えた後、上記の通信がうまくいくとの結論を導き出した。私はこれがpplが可能な回路の問題に注意を引かせるのを助けることができることを願っています。