1

これがばかげた質問ではないことを願っていますが、自分の問題に対する答えを自分で見つけることができません。

私は、一連のバイトを受信して​​保存することになっている Atmega32U4 マイクロコントローラー デバイスに取り組んでいます。私のコードは、LUFA-Library 151115 の CDC 仮想シリアル ドライバー テンプレートに基づいています。コードをテストするために、非常に便利なツール ScriptCommunicator 04.11 を使用します。マイクロコントローラ ユニット (MCU) は USB 経由で PC に接続され、PC ホストによってシリアル com ポート デバイスとして扱われます。私のOSはWindows 7 64ビットです。

現在、6 つの値を受け取って保存する関数を作成しています。そのために、次のコードを使用します。

int16_t Register_1 = 0;     
int16_t Register_2 = 0;     
int16_t Register_3 = 0;     

int16_t Register_4 = 0;
int16_t Register_5 = 0;
int16_t Register_6 = 0;     

int16_t serial_byte = 0;
int8_t loop = 1;

do
{
    serial_byte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);

    serial_byte &= 0x00FF;

    switch (loop)
    {
        case 1:     Register_1 = ad7194_byte;       break;
        case 2:     Register_2 = ad7194_byte;       break;
        case 3:     Register_3 = ad7194_byte;       break;
        case 4:     Register_4 = ad7194_byte;       break;
        case 5:     Register_5 = ad7194_byte;       break;
        case 6:     Register_6 = ad7194_byte;       break;
    }


    CDC_Device_USBTask(&VirtualSerial_CDC_Interface);

    USB_USBTask();

    loop ++ ;

    printf("%i" PRId32 "\n", serial_byte) ;

    _delay_ms(1000);

} while (loop < 7);

以前に同様のコード スニペットを使用したことがありますが、すべて正常に動作しているように見えました。現在、次の問題を特定しました。デバイスは値「255ld」を継続的に受信しています。上記のコードを ScriptCommunicator でテストすると、この値を 6 回受け取ります (上記のコードに printf ステートメントが含まれているのはそのためです)。

これは、Windows が MCU をマウスなどの一般的な USB デバイスとして扱っているためではないでしょうか? そうなのだろうか?

または、これの他の理由は何ですか?

問題を回避するにはどうすればよいですか?

ヒントと回答をお寄せいただきありがとうございます。

4

2 に答える 2

1

フォーマットの使い方が間違っています。

int16_t serial_byte = 0;
//          v (remove i) 
// printf("%i" PRId32 "\n", serial_byte) ;
//             16 not 32
printf("%" PRId16 "\n", serial_byte) ;
于 2016-10-06T15:14:04.057 に答える