2016-09-05 25 views
0

ラップトップからマイクロコントローラに送信されたデータをUART経由で読み取る際に問題があります。送信部はうまく動作します。問題なくラップトップにデータを送信できますが、データをエコーし​​たり、ラップトップからキーボード入力データを読み取ったりすることはできません。私は、ポーリングとRx割り込みルーチンの両方を読むことを実装しようとしましたが、成功しませんでした。私が使用しているマイクロコントローラはATMEGA2560で、私はFTD1232 USB to TTLシリアルコンバータ経由でノートパソコンに接続しています。UART受信キーボード入力が機能しない

私はパテをシリアル通信端末として使用し、Arduino IDEをプログラミング用に使用しています。

私はこの問題が次のハードウェアにないと仮定しています。 - 別のUSARTを初期化しようとしましたが、別のUSBポート、TTLコンバータ、さまざまなワイヤを使用しようとしました。同じ。私はまた、すべてのデバイスに十分な電圧を供給するために別の電源を接続しました。

Rx割り込みが発生したとき(端末に何かを入力したとき)にLEDを点灯させて、少なくとも応答を得ようとしています。

#define F_CPU 16000000UL //16MHz 
#define BAUD 115200UL //bps 
#define BAUD_PRESCALER (((F_CPU/(BAUD*8UL)))-1) //Table 101, page 212 

volatile uint8_t temp; 

void UART_init(){ 
    //Set baud rate 
    UBRR0H = (uint8_t)(BAUD_PRESCALER >> 8); //Higher portion of the baud rate 
    UBRR0L = (uint8_t)BAUD_PRESCALER; //Lower portion of the baud rate 

    //Enable Receiver and Transmitter 
    UCSR0B = (1 << RXEN0) | (1 << TXEN0); 
    //Set frame format: 8-bit format, 1 stop bit, no parity 
    UCSR0C |= (3 << UCSZ00); 
    UCSR0C &= ~(1 << USBS0); //clear for 1 stop bit 

    //Set Double Speed Asynchronous mode 
    UCSR0A |= (1 << U2X0); 

    UCSR0B |= (1 << RXCIE0); //Enables interrupt rxc 
} 

uint8_t UART_getchar(){ 
    //Wait for RXC flag 
    while(!(UCSR0A & (1 << RXC0))){}; 
    return UDR0; 
} 

//Arduino setup() 
void setup(){ 
    pinMode(8, OUTPUT); 
    UART_init(); 
    sei(); 
} 

//Arduino loop() 
void loop(){ 
    delay(500); 
    UART_putchar('a'); 
} 

ISR(USART0_RX_vect){ 
    temp = UDR0; 
    digitalWrite(8, HIGH); 
} 

それは長ったらしいポストですが、私は具体的にしても、全体のコードを投稿してみました。 ATMEGA2560用に使用しているデータシートはhereです。

マイパテの設定は:

COM Port Settings

+0

あなたのL既にEDコード(すなわち、自由にオン/オフすることができます)。あなたはrecvピン/ワイヤを含むすべての接続を確認するために、ポーリングモードでrecvを試しましたか(つまり、割り込みを使用しないでください)?ポーリングが動作すると、割り込みをデバッグします。あなたのinitと_seems_ okayをチェックしましたが、OR/ANDの代わりに明示的な代入を使用した方が幸いです。 **誤って9ビット**モードを設定していないことを確認してください。[219ページ] 3番目のUSCZビットはUCSRB [および、下位2つのUCSRCと同じです。そして、227ページから始まるレジスタのビット定義を見てください。 '.h'をdocにクロスチェックしてください。 –

+0

ArduinoはCではありません! [ask]を参照し、スニペットだけでなく[mcve]を提供してください。 – Olaf

+0

1つを選択:ポーリングまたはRX ISR。そしてArduino SerialもISRを使用していることを忘れないでください。 – KIIV

答えて

0

私はちょうど私のメガボード上でそれをテストしてみた割り込みが(簡単なループバック)を有効にすることなく、それが正常に働いています:

#define BAUD 115200UL 
#define BAUD_PRESCALER (((F_CPU/(BAUD*8UL)))-1) 

volatile uint8_t temp; 

void UART_init(){ 
    //Set baud rate 
    UBRR0H = (uint8_t)(BAUD_PRESCALER >> 8); //Higher portion of the baud rate 
    UBRR0L = (uint8_t)BAUD_PRESCALER; //Lower portion of the baud rate 

    //Enable Receiver and Transmitter 
    UCSR0B = (1 << RXEN0) | (1 << TXEN0); 
    //Set frame format: 8-bit format, 1 stop bit, no parity 
    UCSR0C |= (3 << UCSZ00); 
    UCSR0C &= ~(1 << USBS0); //clear for 1 stop bit 

    //Set Double Speed Asynchronous mode 
    UCSR0A |= (1 << U2X0); 
// UCSR0B |= (1 << RXCIE0); //Enables interrupt rxc 
} 

uint8_t UART_getchar(){ 
    //Wait for RXC flag 
    while(!(UCSR0A & (1 << RXC0))){}; 
    return UDR0; 
} 

void UART_putchar(uint8_t data){ 
    //Do nothing until UDR is ready 
    while(!(UCSR0A &(1 << UDRE0))){}; 
    UDR0 = data; 
} 

void UART_putstring(uint8_t *data){ 
    while(*data != 0x00){ 
    UART_putchar(*data); 
    data++; 
    } 
} 

//Arduino setup() 
void setup(){ 
    pinMode(8, OUTPUT); 
    UART_init(); 
    sei(); 
} 

//Arduino loop() 
void loop(){ 
    UART_putchar(UART_getchar()); 
} 

/*ISR(USART0_RX_vect){ 
    temp = UDR0; 
    digitalWrite(8, HIGH); 
}*/ 

RX割り込みがなければなりません無効、そうでない場合シリアル割り込みベクタが発生し、ポーリングされますget charはISRによって文字が読み込まれると機能しません

+0

問題は明らかに私が使っていたFTDI(両方)にありました。ボードをプログラムするために使用するUSB​​ケーブルのみを接続してコードを実行すると、すべて正常に動作しますが、FTDIを介して通信しようとすると送信動作のみが行われます。私はさらにそれを見ていきます。ありがとうございました:) – soundonly01

+0

USART0を使用していた場合、オンボードUSBシリアルも接続されていますが、あまり驚いていません。それが他のUSARTで動作していない場合、それは変です。とにかく、簡単なループバックテストを行うために、TXとRXを接続してFTDIチップをテストすることができます。 – KIIV

関連する問題