zoukankan      html  css  js  c++  java
  • 在 S5PV210 的 开发板上 点亮 一个 LED 灯

    参考学习教程:周立功嵌入式Linux开发教程-(上册)

    材料:首先 准备一个 安装好 Linux 的 开发板  

     使用  xshell 工具 连接 开发板  ,winscp 工具 连接 开发板  ,  准备 一个 Ubuntu  32位 ,装上 交叉编译链。。

    使用下面 代码 和 Makefile 文件 进行编译  ,生成的  执行 文件  利用 winscp 软件复制到 Linux开发板上 ,利用 xshell 运行 这个可执行文件。

    下面    代码的  功能  是   新建 一个 TCP 客户端 连接服务器 (Windows上 的一个 网络 调试工具 NetAssist.exe ,简称网络调试助手 ,类似串口工具)

     注意 其中:  #define LED_PATH "/sys/devices/platform/x210-led"  是  开发板 中   led   的路径

    #include <stdint.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <getopt.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <linux/types.h>
    #include <string.h>
    
    //socket 头文件 2017年6月28日09:40:47,所长
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <errno.h>
    #include <stdbool.h>
    
    #define LED_PATH             "/sys/devices/platform/x210-led"
    
    #define OPEN_LED            "1"
    #define OFF_LED                "0"
    
    #define LED1            1
    #define LED2            2
    #define LED3            3
    #define LED4            4
    
    #define ledOperationTypeOPEN    1
    #define ledOperationTypeOFF        0
    
    #define SERVER_IP    "192.168.10.11"
    #define SERVER_PORT    ((uint16_t)7007)
    
    int led(int ledNumber,int ledOperationType)
    {
        
        char path[40],data[2];
        
        int fd, ret, flag;
    
        strcpy(path, LED_PATH);
        
        if       ( ledNumber == 1 )
            strcat(path, "/led1");
        else if( ledNumber == 2 )
            strcat(path, "/led2");
        else if( ledNumber == 3 )
            strcat(path, "/led3");
        else if( ledNumber == 4 )
            strcat(path, "/led4");
        else
            return -1;
        
        printf("打开路径%s文件",path);
        
        fd = open(path, O_RDWR);//打开/sys/devices/platform/x210-led路径下的 led ledNumber 文件
        
        if( fd < 0 ) //判断是否打开失败
        {
            perror("open");
            return -2;
        }
        else
        {
            printf("led%d 文件打开成功.
    ",ledNumber);
        }
    
        
        if( ledOperationType == 1)
            ret = write(fd, OPEN_LED, strlen(OPEN_LED) );//文件写入内容: OPEN_LED
        else if( ledOperationType == 0)
            ret = write(fd, OFF_LED, strlen(OFF_LED) );     //文件写入内容: OFF_LED
        else
            return -3;
        
        if( ret < 0 ) 
        {
            perror("write");
            return -4;
        }
        else
        {
            flag =1;
            printf("led%d 文件写入ledOperationType(1:打开LED 0:关闭LED): %d 数据成功.
    ",ledNumber,ledOperationType);
        }
    
    /*     for(;;)
        {
            
            //闪烁 LED1
            
            if( flag == 1 )
            {//如果LED灯 是打开的状态 就关闭LED灯
                flag = 0;
                ret = write(fd, OFF_LED, strlen(OFF_LED) );//文件写入内容:  OFF_LED
            }
            else
            {//如果LED灯 是关闭的状态 就打开LED灯
                flag = 1;
                ret = write(fd, OPEN_LED, strlen(OPEN_LED) );//文件写入内容:OPEN_LED
            }
            
            
            sleep(1);
            
            
        } */
        
        printf("关闭文件,退出进程!
    ");
        
        close(fd);//文件写入完毕后 要进行关闭文件
        
        return 0;
        
    }
    
    int main(int argc, char *argv[])
    {
        int flag =0 ;
        
        int conn_sock;
    
        struct sockaddr_in    server_addr;
        
        char tempBuffer[64] ={0};
        
        server_addr.sin_addr.s_addr    = inet_addr(SERVER_IP);
        server_addr.sin_family        = AF_INET;
        server_addr.sin_port        = htons(SERVER_PORT);
        
        
        conn_sock = socket(AF_INET, SOCK_STREAM, 0);
        
        if (conn_sock < 0) 
        {
            perror("socket(2) error");
            goto create_err;
        }
        else
        {
            printf("socket 创建成功 .
    ");    
        }
        
        if (connect(conn_sock,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0) 
        {
            perror("connect(2) error");
            
            printf("连接服务器IP:%s 端口号:%d 连接失败 .
    ",SERVER_IP,SERVER_PORT);    
            
            //goto err;
        }
        else
        {
            printf("连接服务器IP:%s 端口号:%d 连接成功 .
    ",SERVER_IP,SERVER_PORT);    
        }
        
        for(;;)
        {
            if ( read( conn_sock, tempBuffer, sizeof(tempBuffer) ) < 0) 
            {
                perror("receive data error");
                
                printf("接收数据失败.
    ");
    
                //goto err;
            }
            
            //printf("接收的数据是:%s
    ", tempBuffer);
            
            led( tempBuffer[0] - 0x30, tempBuffer[1] - 0x30  );
            
            sprintf(tempBuffer,"LED%c ledOperationType(1:OPEN 0:OFF):%c OK.
    ",tempBuffer[0], tempBuffer[1]);
            
            if (write(conn_sock, tempBuffer, strlen(tempBuffer)) < 0) 
            {
                perror("send data error");
                //goto err;
            }
        }
        
     err:
        close(conn_sock);
        return -1;
        
     create_err:
        fprintf(stderr, "client error");
        return -1;
        
    /*      for(;;)
        {
            //闪烁 LED1
            
            if( flag == 1 )
            {//如果LED灯 是打开的状态 就关闭LED灯
                flag = 0;
                led( LED1 ,ledOperationTypeOFF  );
            }
            else
            {//如果LED灯 是关闭的状态 就打开LED灯
                flag = 1;
                led( LED1 ,ledOperationTypeOPEN );
            }
            
            sleep(1);
    
        }  */
        
    }

      

    注意 下面 是 Makefile 文件  :  其中 arm-gcc-linux  在 安装交叉 编译器 的时候被我 重定义了  应该是 :arm-none-linux-gnueabi-gcc

    CFLAGS += -Wall
    obj := led 
    src := led.c
    CC  := arm-linux-gcc 
    
    $(obj): $(src)
        $(CC) $(CFLAGS) $^ -o $@ -g
    
    .PHONY: clean
    clean:
        -rm $(obj) 

  • 相关阅读:
    Elasticsearch本地环境安装和常用操作
    Scala快速入门
    Flink本地安装和创建Flink应用
    Elasticsearch源码分析
    android6,0申请权限
    JDK动态代理
    Navicat 连接MySQL8.0,错误:Authentication plugin 'caching_sha2_password' cannot be loaded
    mysqldump
    mysql配置远程登录
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/suozhang/p/7093119.html
Copyright © 2011-2022 走看看