Linux系统getopt使用示例

Posted 绿杨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统getopt使用示例相关的知识,希望对你有一定的参考价值。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <stdint.h>
 5 
 6 void usage()
 7 {
 8     fprintf(stderr,
 9             "\nUsage:  mcu_dload [OPTIONS] *.bin\n"
10             "  -a  Specify device I2C slave address(7Bit), eg: -a 5E, default is 0x58\n"
11             "  -d  Download binary code for MCU only\n"
12             "  -h  This Page.\n\n"
13     );
14     exit(0);
15 }
16 
17 uint8_t asc2hex(char asccode)
18 {
19     uint8_t ret;
20     if(0 <= asccode && asccode <= 9)
21         ret = asccode - 0;
22     else if(a <= asccode && asccode <= f)
23         ret = asccode -a + 10;
24     else if(A <= asccode && asccode <= F)
25         ret = asccode - A + 10;
26     else ret = 0;
27     return ret;
28 }
29 
30 int main(int argc, char **argv)
31 {
32     int opt;
33     uint32_t i = 0;
34     uint8_t i2c_adr = 0x58, i2c_reg;
35     FILE *fp;
36     
37     // Parse Command Line Options
38     while((opt = getopt(argc, argv, "a:h?")) != EOF) {
39         switch(opt) {
40             case a:
41                 i2c_adr = (asc2hex(optarg[0]) << 4) | asc2hex(optarg[1]);
42                 printf("I2C Device Address(7Bit) is 0x%2X.\n", i2c_adr);
43                 break;
44             case h:
45             case ?:
46             default:
47                 usage();
48                 break;
49         }
50     }
51 
52     // Last One is the input file
53     if(optind + 1 != argc) {
54         printf("Input file not found!\n");
55         usage();
56         exit(0);
57     }
58 
59     // Open *.bin file and download it to MCU
60     fp = fopen(argv[optind], "r");
61     if(fp == NULL) {
62         printf("Input file can not open!\n");
63         usage();
64         exit(0);
65     }
66     
67     // Get file size
68     fseek(fp, 0L, SEEK_SET);
69     fseek(fp, 0L, SEEK_END);
70     uint32_t binsize = ftell(fp);
71     printf("Inpuf file size is %d Bytes.\n", binsize);
72 
73     uint8_t *bincode = (uint8_t *)malloc(binsize);
74     fseek(fp, 0L, SEEK_SET);
75     fread(bincode, 1L, binsize, fp);
76     fclose(fp);
77     
78     // Download
79     printf("Reset MCU ...\n");
80     printf("Dowloading bin ...\n");
81 
82     uint32_t dpos = binsize >> 6;
83     for(i = 0; i < binsize; ++i) {
84         if(i % dpos == 0) printf("#");
85         usleep(5000);
86         //CH341WriteI2C(0, i2c_adr, i2c_reg, bincode[i]);
87         fflush(stdout);
88     }
89     printf("\nFile download succeed, %d Bytes transfered!\n", binsize);
90 
91     free(bincode);
92     return 0;
93 }

 

以上是关于Linux系统getopt使用示例的主要内容,如果未能解决你的问题,请参考以下文章

Linux下getopt()函数的简单使用

程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例

如何在 bash 中使用 getopts 的示例

sh 如何使用bash / getopt解析选项的示例

Linux getopt/getopts解析命令行参数教程

linux-c getopt()参数处理函数