通过网络控制mini2440上的LED

本文介绍了如何通过C/S架构,利用网络和socket编程,实现PC客户端远程控制mini2440开发板上的LED。客户端负责判断用户输入并发送,服务器端接收信息并执行对应GPIO操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文章
关于开发板上的LED的控制,是通过gpio来实现的,参考文章:http://blog.youkuaiyun.com/q1070292175/article/details/17307381
关于socket编程,参考文章:http://blog.youkuaiyun.com/jisuanji_wjfioj/article/details/39012153
本篇思路
采用C/S架构,pc机为客户端,开发板为服务器。
对于客户端来说,主要工作是:判断用户输入是否合法,向服务器发送用户输入。
对于服务器来说监听端口,接受来自客户端的信息,解析信息,完成相应的操作。
源代码
common.h

#define MAX_LINE 100

struct data{
    char name[5];
    char ctl[4] ;
};


#ifndef _GPIO_H
#define _GPIO_H

#define LED1_direction  "/sys/class/gpio/gpio37/direction"
#define LED1_value  "/sys/class/gpio/gpio37/value"

#define LED2_direction  "/sys/class/gpio/gpio38/direction"
#define LED2_value  "/sys/class/gpio/gpio38/value"

#define LED3_direction  "/sys/class/gpio/gpio39/direction"
#define LED3_value  "/sys/class/gpio/gpio39/value"

#define LED4_direction  "/sys/class/gpio/gpio40/direction"
#define LED4_value  "/sys/class/gpio/gpio40/value"


#define LED_export  "/sys/class/gpio/export"
#define LED_unexport    "/sys/class/gpio/unexport"

#define on  "0"
#define off "1"

#define LED1 "37"
#define LED2 "38"
#define LED3 "39"
#define LED4 "40"

#define OUT "out"

extern int my_write(char file_name[], char command[]);
extern void gpio_init();
extern void led_on(char led_name[]);
extern void led_off(char led_name[]);

gpio.h
//用于初始化gpio

/*********************************
*把命令写入指定的GPIO
*********************************/
int my_write(char file_name[], char command[])
{
    int fp;
    if((fp = open(file_name, O_WRONLY)) == -1){
        perror("fail to open ");
        return -1;
    }
    if(write(fp, command, strlen(command)) == -1){
        perror("fail to write");
        return -1;
    }
    close(fp);
    return 1;
}
/********************************
*功能:初始化GPIO
********************************/
void gpio_init()
{
    //LED1 init
    if(my_write(LED1_direction, OUT) == -1){
        my_write(LED_export, LED1);
        my_write(LED1_direction, OUT);
    }
    printf("LED1 init success!\n");
    //LED2 init
    if(my_write(LED2_direction, OUT) == -1){
        my_write(LED_export, LED2);
        my_write(LED2_direction, OUT);
    }
    printf("LED2 init success!\n");
    //LED3 init
    if(my_write(LED3_direction, OUT) == -1){
        my_write(LED_export, LED3);
        my_write(LED3_direction, OUT);
    }
    printf("LED3 init success!\n");
    //LED4 init 
    if(my_write(LED4_direction, OUT) == -1){
        my_write(LED_export, LED4);
        my_write(LED4_direction, OUT);
    }
    printf("LED4 init success!\n"); 
}
/*************************************
*功能:打开指定的LED
***************************************/
void led_on(char led_name[])
{
    if(!strcasecmp(led_name, "led1"))
        my_write(LED1_value, on);
    if(!strcasecmp(led_name, "led2"))
        my_write(LED2_value, on);
    if(!strcasecmp(led_name, "led3"))
        my_write(LED3_value, on);
    if(!strcasecmp(led_name, "led4"))
        my_write(LED4_value, on);
}
/*************************************
*功能:关闭指定的LED
***************************************/
void led_off(char led_name[])
{
    if(!strcasecmp(led_name, "led1"))
        my_write(LED1_value, off);
    if(!strcasecmp(led_name, "led2"))
        my_write(LED2_value, off);
    if(!strcasecmp(led_name, "led3"))
        my_write(LED3_value, off);
    if(!strcasecmp(led_name, "led4"))
        my_write(LED4_value, off);
}

服务器端:
server.c

int my_fun(struct data buf)
{
    if(!strcasecmp(buf.ctl, "on")){
        led_on(buf.name);
        return 1;
    } else if(!strcasecmp(buf.ctl, "off")){
        led_off(buf.name);
        return 1;
    }else return 0;
}

int main(int argc, char *argv[])
{
    struct data buf; 
    struct sockaddr_in sin ;
    struct sockaddr_in cin ;
    int l_fd ;
    int c_fd ;
    socklen_t len ;
    //char buf[MAX_LINE] ;
    char addr_p[INET_ADDRSTRLEN] ;
    int port = 8000 ;
    int n ;
    bzero(&sin, sizeof(sin)) ;
    sin.sin_family = AF_INET ;
    sin.sin_addr.s_addr = INADDR_ANY ;
    sin.sin_port = htons(port) ;
    l_fd = socket(AF_INET, SOCK_STREAM, 0) ;
    bind(l_fd, (struct sockaddr*) &sin, sizeof(sin)) ;
    listen(l_fd, 10) ;
    printf("waiting......\n") ;
    while(1){
        c_fd = accept(l_fd, (struct sockaddr*) &cin, &len) ;
        inet_ntop(AF_INET, &cin.sin_addr, addr_p, sizeof(addr_p)) ;
        printf("client IP is: %s \n port is %d \n", addr_p, ntohs(cin.sin_port)) ;
        while(1){
            n = read(c_fd, &buf, MAX_LINE) ;
            if(!strcasecmp(buf.name, "exit")){
                printf("client will be exit\n");
                sleep(1);
                break;
            }
            if(my_fun(buf))
                write(c_fd, "success!", 8) ;
            else
                write(c_fd, "fail to ctl!", 11);
            printf("nume :%s\nctl:%s\n", buf.name, buf.ctl) ;
        }
        close(c_fd ) ;
    }
    return 0 ;
}

客户端:
client.c

int main(int argc, char *argv[])
{
    struct sockaddr_in sin ;
    struct data buf;
    char mes[100];
    int sfd ;
    int port = 8000 ;
    if(argc < 1 ){
        printf("used as:name IP");
        return -1;
    }
    bzero(&sin, sizeof(sin)) ;
    sin.sin_family = AF_INET ;
    inet_pton(AF_INET, argv[1], &sin.sin_addr) ;
    sin.sin_port = htons(port) ;
    sfd = socket(AF_INET, SOCK_STREAM, 0) ;
    connect (sfd, (const struct sockaddr*)&sin, sizeof(sin) ) ;
    while(1){   
        scanf("%s", buf.name);
        if(!strcasecmp(buf.name, "exit")){
            write(sfd, &buf, sizeof(buf)) ;
            printf("client will exit !\n");
            sleep(1);       
            goto end1;
        }else if(!strcasecmp(buf.name, "led1") || !strcasecmp(buf.name, "led2")
            || !strcasecmp(buf.name, "led3") || !strcasecmp(buf.name, "led4") ){
                scanf("%s", buf.ctl);       
                write(sfd, &buf, sizeof(buf)) ;
                read(sfd, mes, MAX_LINE) ;
                printf("result is :%s\n", mes) ;
        }
        else {
            printf("please input like : led1/2/3/4 on/off\n");
            fflush(stdin);  
        }
    }
end1:
    close(sfd) ;
    return 0 ;
}

Makefile

all:server client

server:server.c
    arm-linux-gcc server.c gpio.c -o server
client:client.c
    gcc client.c -o client
clean:
    rm *.o server client
.PHONY:clean
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值