アイデアは次のとおりです。
- USBポート経由でarduinoをPCに接続します(Windows 7、管理者ログイン)
- システムが自動的にコマンドを実行します (例: shutdown -s -t 3600)
ホストでプロキシアプリケーションを使用せずにそれを行うことは可能ですか?
アイデアは次のとおりです。
ホストでプロキシアプリケーションを使用せずにそれを行うことは可能ですか?
この質問の基本に対処する 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 が話すのを待ちます。