20240823 system()读取io口状态 popen()接收io操作的返回信息

读取工控机io system 与 popen

os.system()、os.popen()和subprocess的区别(一)

函数system

直接读文件最快![Linux] Ubuntu实机下控制GPIO

io操作API

工控机的io口操作的函数
需要通过命令行执行
在这里插入图片描述
具体指令内容:
在这里插入图片描述

c++ system()

返回数据为字符串
c++程序中通过sytem(cmd)可以执行该操作,但无法接收到返回值
system()操作成功的返回值是0
io信息只打印在终端中
执行过程平均15ms
在这里插入图片描述

popen

通过popen可以开启管道接收system返回的字符串到程序中
在这里插入图片描述
但是耗时更久了,平均55ms
在这里插入图片描述

open

通过文件直接读取DIO电平

#include "stdio.h"
#include "fcntl.h"
#include "unistd.h"//引用需要的头文件
 
int main(void)
{
	int fd;
	char value=0;
	
	fd = open("/sys/class/gpio/export",O_RDWR);     //fd作为可读可写的/sys/class/gpio/export
	write(fd,"36",2);                               //启用36号ID引脚,返回的期望值为2个字符
	close(fd);                                      //释放FD
 
	fd = open("/sys/class/gpio/gpio36/direction",O_RDWR);
	write(fd,"in",3);                               //36号ID设为输入
	close(fd);
 
    fd = open("/sys/class/gpio/gpio36/value",O_RDWR); //fd作为IO口的电平状态value
	while(1)
    {
		read(fd,&value,1);                          //读入电平
		printf("Value =%c \r\n",value);             //打印电平状态
        sleep(1);                                   //延时1S
	}
	return 0;
}

类似地

	char tmp[1024];
    memset(tmp, 0 , 1024);
    std::string result;
    int fd ;
    fd = open("/sys/kernel/debug/asus-nb-wmi/call", O_RDWR);
    // cout << " open call res : " << fd  << endl;
   int rest =   read(fd, tmp, 100 );
    result += tmp;
    close(fd);
	// 从返回字符串中截取倒数第二个字符为电平状态
   fd= result.size();
    string res = result.substr(fd-2,1);
    fd = atoi(res.c_str());
    // cout << " res : " << x << endl;
    return fd;

时间测试,1.3ms读取一次
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值