对于电赛来说,假设我们用树莓派来实现图像处理的任务,那么面临的一个问题就是任务切换.比如任务一是实现颜色识别,任务二是实现无人机寻迹,那么有没有一种办法,我通过按键选择我要运行的程序.

    一个很简单的思路就是写一个可执行文件,这个文件能响应按键操作,按键中断函数包括选择程序1,选择程序2,关机任务,复位任务等.直接上代码,代码写的很明白,不明白的请留言.

#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <wiringPi.h>
#include <wiringSerial.h>
#include <ctype.h>
#include <unistd.h>

#define     Pin_led     28
#define     Pin_led2     29
#define find_line    25
#define camshift     24
#define shout_down   22
#define Cam_Con      23

int  set_gpio(void);
void  find_line_Callback(void);
void camshift_Callback(void);

using namespace std;

int main()
{
    set_gpio();
    while(1)
    {
        digitalWrite(Pin_led,0);//指示灯
        delay(30);
        digitalWrite(Pin_led2,1);//指示灯
        delay(30);
        digitalWrite(Pin_led,1);//指示灯
        delay(30);
        digitalWrite(Pin_led2,0);//指示灯
        delay(30);
    }
    return 0;
}

//中断处理函数:camshift
void camshift_Callback(void)
{
    delay(50);
    digitalWrite(Pin_led,0);//指示灯
    if(digitalRead(camshift)==0)
    {
        char *const ps_argv[] ={"ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL};
        execv("/home/pi/QTpro/build-Camshift_auto_7_10_1-GCC-Debug/Camshift_auto_7_10_1", ps_argv);
    }
}

//中断处理函数:find_line
void find_line_Callback(void)
{
    delay(50);
     digitalWrite(Pin_led,0);//指示灯
    if(digitalRead(find_line)==0)
    {
        char *const ps_argv[] ={"ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL};
        execv("/home/pi/QTpro/轮廓查找/build-Find_contours-GCC-Debug/Find_contours", ps_argv);
    }
}

//中断处理函数:shout_down
void Shout_down_Callback(void)
{
    delay(50);
    if(digitalRead(shout_down)==0)
    {
        system("sudo shutdown -h now");//调用关机命令。
        while(1);
    }
}

void Cam_Con_Callback(void)
{

    delay(50);
    if(digitalRead(Cam_Con)==0)
    {
        char *const ps_argv[] ={"ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL};
        execv("/home/pi/QTpro/build-Cam_contours-GCC-Debug/Cam_contours", ps_argv);
    }
}

int  set_gpio(void)
{

    if (wiringPiSetup () == -1)
    {
      fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
      return 1 ;
    }

    pinMode(camshift,INPUT);            //配置1脚为输入
    pullUpDnControl(camshift,PUD_UP);  //将1脚上拉到3.3v

    pinMode(find_line,INPUT);            //配置1脚为输入
    pullUpDnControl(find_line,PUD_UP);  //将1脚上拉到3.3v

    pinMode(shout_down,INPUT);            //配置1脚为输入
    pullUpDnControl(shout_down,PUD_UP);  //将1脚上拉到3.3v

    pinMode(Cam_Con,INPUT);            //配置1脚为输入
    pullUpDnControl(Cam_Con,PUD_UP);  //将1脚上拉到3.3v

    //注册中断处理函数
      if(0>wiringPiISR(camshift,INT_EDGE_FALLING,camshift_Callback))
      {
          printf("interrupt function register failure");
          exit(-1);
      }

      if(0>wiringPiISR(find_line,INT_EDGE_FALLING,find_line_Callback))
      {
          printf("interrupt function register failure");
          exit(-1);
      }

      if(0>wiringPiISR(shout_down,INT_EDGE_FALLING,Shout_down_Callback))
      {
          printf("interrupt function register failure");
          exit(-1);
      }

      if(0>wiringPiISR(Cam_Con,INT_EDGE_FALLING,Cam_Con_Callback))
      {
          printf("interrupt function register failure");
          exit(-1);
      }

      pinMode(Pin_led,OUTPUT);//亮灯用
      pinMode(Pin_led2,OUTPUT);//亮灯用
}

    将生成的可执行文件设置成自启动,之后在测评现场就可以通过按键选择不同的可执行文件了,也就是不同的任务程序.

   其中

char *const ps_argv[] ={"ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL};
        execv("/home/pi/QTpro/build-Cam_contours-GCC-Debug/Cam_contours", ps_argv);

  就代表了打开Cam_contours这个程序.同时建议在上面每个可执行程序里写一个能映射回主选择程序的终端处理函数.这样子就可以在各个可执行文件之间进行切换了.