1

アイデアは次のとおりです。

  1. USBポート経由でarduinoをPCに接続します(Windows 7、管理者ログイン)
  2. システムが自動的にコマンドを実行します (例: shutdown -s -t 3600)

ホストでプロキシアプリケーションを使用せずにそれを行うことは可能ですか?

4

1 に答える 1

0

この質問の基本に対処する 2 つのコード スニペットを次に示します。まず、「DIR」コマンドを発行するスケッチです。明らかに、これは任意のコマンドである可能性があります。

    #include <stdio.h>

    uint8_t command[] = "dir\0";

    void setup() 
    {
     Serial.begin(9600);
     delay(10000);
     Serial.write(command, 4);
    }

    void loop() {}

2 つ目は、COM5 を読み取り、文字列を受け取った後にコマンドを発行する C コードです。

/*
 * main.c
 *
 *  Created on: Sep 29, 2013
 *      Author: Jack Coleman
 *
 *  This software is for demonstration purposes only.
 *
 */

#include <stdio.h>
#include <Windows.h>

//
// create a console that accepts data
// from a com port and issues it as system commands.
//
void display_config(COMMCONFIG *config_comm)
{
    printf("BaudRate = ");
    switch (config_comm->dcb.BaudRate)
    {
       case CBR_9600 : printf("9600\n");
    }
    printf("Parity   = %d\n", config_comm->dcb.Parity);
    printf("StopBits = %d\n", config_comm->dcb.StopBits);
    printf("ByteSize = %d\n", config_comm->dcb.ByteSize);
    fflush(stdout);

}

main()  // Version 0
{
    HANDLE hCOM5;

    int   config_size;

    COMMCONFIG config_comm;

    int   retc;
    int   nr_read;

    char *comm_char;
    char  sysline[271];

    hCOM5 = CreateFile("COM5", GENERIC_READ, 0, 0,
                     OPEN_EXISTING, 0, NULL);
    if (hCOM5 <= 0)
    {
        printf("unable to open COM5");
        return;
    }

    GetCommConfig(hCOM5, &config_comm, &config_size);

    config_comm.dcb.BaudRate = CBR_9600;
    config_comm.dcb.Parity   = NOPARITY;
    config_comm.dcb.StopBits = ONESTOPBIT;
    config_comm.dcb.ByteSize = 8;

    retc = SetCommConfig(hCOM5, &config_comm, config_size);
    if (retc == 0)
    {
        printf("SetCommConfig failed.\n");
        return;
    }

    display_config(&config_comm);

    // wait here for a possible, initial
    // series of 0xFF.
    comm_char = sysline;
    do
    {
        ReadFile(hCOM5, comm_char, 1, &nr_read, NULL);

        printf("%x nr_read = %d\n", *comm_char, nr_read);
        fflush(stdout);

    } while (nr_read == 0);

    while (nr_read == 1)
    {
      if (*comm_char == 0x00)
      {
         printf("%s\n", &sysline[0]);
         fflush(stdout);

         system(&sysline[0]);
         break;

      } else {
          comm_char++;
      }

      ReadFile(hCOM5, comm_char, 1, &nr_read, NULL);

      printf("%02x\n", *comm_char);
      fflush(stdout);

    }

    return;
}

これは楽しいコーディングの問題でした。いくつかの教訓が得られました: 1) シリアル ライン経由で通信する場合、C プログラムは最初のバイトが Arduino によって送信されるまで単に待機します。データ転送の前に同期文字はありません(つまり、システム コードによって取り除かれる文字がある場合)。2) 読み取ったバイト数がゼロ (0) になる可能性があります。

これを使用して Arduino を使用してシャットダウン コマンドを発行できますか? はい。ただし、プログラムを開始する必要があります (つまり、スケジュール)。そして、Arduino が話すのを待ちます。

于 2013-10-01T04:54:54.660 に答える