1

这个想法是:

  1. 通过 USB 端口将 arduino 连接到 PC(Windows 7,管理员登录)
  2. 系统自动执行命令(例如:shutdown -s -t 3600)

是否可以在不使用主机上的代理应用程序的情况下做到这一点?

4

1 回答 1

0

这里有两个代码片段解决了这个问题的基本原理。首先,是一个发出“DIR”命令的草图。显然,这可以是任何命令。

    #include <stdio.h>

    uint8_t command[] = "dir\0";

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

    void loop() {}

其次,是读取 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 回答