我正在C
中编写一个函数以打开串行端口并读取芯片中的闪存数据。我想将串行端口参数传递给此函数,然后打开COM 4
。
我试图使用这些方法来调用函数:
ret = download_main(1,'-C'+ 4);
ret = download_main(1,'-C4');
char array_1[] = { "-C4"};
ret = download_main(1, array_1);
ret = download_main(1, "-C4");
并将功能定义更改为int download_main(int argc, char *argv)
char *args[] = { "-C4", NULL };
ret = download_main(1, args);
但是所有人都无法将参数传递给该函数并打开COM4
。
函数调用
int main(int argc, char *argv[])
{
int ret;
char* COMx = "com4";
FILE* fp;
printf("open com!\n");
/** Open Com */
if ((fp = fopen(COMx, "wb+")) == NULL) {
printf("Open %s Failed!\n", COMx);
}
/** Send "Hello,world!" */
fwrite((char*)"Hello,world!", sizeof("Hello,world!"), 1, fp);
char *args[] = { "-C4", NULL };
ret = download_main(1, args);
return ret;
}
该函数称为:
int download_main(int argc, char *argv[])
{
BOOL fSuccess;
TCHAR commPort[16];
TCHAR *numStr;
int len, i,ch;
int poweroff_param;
char *optstring = "C:c:r:F:f:P:w:b:B:R:A:l:h";
bininfo_node *bin_info = NULL;
opterr = 1;
if (argc < 3)
{
usage();
return 0;
}
optind = 0;
while((ch=getopt(argc,argv,optstring))!=-1)
{
switch(ch)
{
case 'c':
g_calibrate_switch = atoi(optarg);
if(1 == g_calibrate_switch)
printf("burn flash then entry calib mode\n");
break;
case 'C':
numStr = optarg;
len = _tcslen(numStr);
for (i = 0; i < len; i++)
{
if (!_istdigit(numStr[i]))
{
TRACE("Error: Invalid COM number: %s", numStr);
g_dldtool_exit_code = EXIT_CODE_COM_NUM_ERROR;
goto _exit;
}
}
_stprintf_s(commPort, sizeof(commPort) / sizeof(TCHAR), "\\\\.\\COM%s", optarg);
break;
此程序中没有编译错误。当我调试该程序时,它会一直以代码0退出,并提醒我在不通过download_main
函数中的断点的情况下向函数添加参数,如下所示:
答案 0 :(得分:1)
就像您使用的main
一样,您必须正确准备字符串:
char *args[] = {"download_main", "-C4", NULL};
ret = download_main(2, args);
更新:
正如@rici指出的,在扫描之前设置optind=0
并不意味着第一个参数由getopt
传递。因此,您必须提供一个附加的第一个参数。通常,当使用参数列表调用main
时,它拥有程序的名称,但是对于您自己的函数调用,第一个字符串中的内容无关紧要。