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 }

 

posted @ 2017-12-29 22:07  BH5HSV  阅读(375)  评论(0编辑  收藏  举报