QQ624353765 发表于 2023-4-26 14:08:57

第三方应用程序调用STC发布项目程序对单片机进行ISP下载

第三方应用程序调用STC发布项目程序对单片机进行ISP下载, 可以吗

我的设备有一套自己的上位机软件,我是想程序升级直接用我的上位机完成升级,
不需要再让我司的用户再去打开另外一个,STC帮我们发布的虽然也是我们用户自己界面的软件去升级,
如果发布项目程序能内嵌到我们用户的专有的上位机进行升级,我们用户就会更方便了


神农鼎 发表于 2023-4-26 16:01:39

可以



附录Q      使用第三方应用程序调用STC发布项目程序对单片机进行ISP下载
使用STC的ISP下载软件生成的发布项目程序为可执行的EXE格式文件,用户可直接双击发布的项目程序运行进行ISP下载,也可在第三方的应用程序中调用发布项目程序进行ISP下载。下面介绍两种调用的方法。简单调用在第三方应用程序中只是简单创建发布项目程序的进程,其他的所有下载操作均在发布项目程序中进行,第三方应用程序此时只需要等待发布项目程序操作完成后,清理现场即可。VC代码
BOOL IspProcess(){         //定义相关变量         STARTUPINFO si;         PROCESS_INFORMATIONpi;         CString path;         //发布项目程序的完整路径         path =_T("D:\\Work\\Upgrade.exe");         //变量初始化         memset(&si, 0,sizeof(STARTUPINFO));         memset(&pi, 0,sizeof(PROCESS_INFORMATION));         //设置启动变量         si.cb =sizeof(STARTUPINFO);         GetStartupInfo(&si);         si.wShowWindow =SW_SHOWNORMAL;         si.dwFlags =STARTF_USESHOWWINDOW;         //创建发布项目程序进程         if(CreateProcess(NULL, (LPTSTR)(LPCTSTR)path, NULL, NULL, FALSE, 0, NULL, NULL,&si, &pi))         {                  //等待发布项目程序操作完成                  //由于此处会阻塞主进程,所以建议新建工作进程,在工作进程中进行等待                  WaitForSingleObject(pi.hProcess,INFINITE);                  //清理工作                  CloseHandle(pi.hThread);                  CloseHandle(pi.hProcess);                   returnTRUE;         }         else         {                  AfxMessageBox(_T("创建进程失败 !"));                   returnFALSE;         }}

高级调用在第三方应用程序创建发布项目程序的进程,并在第三方应用程序中进行包括选择串口、开始ISP编程、停振ISP编程以及关闭发布项目程序等的全部ISP下载操作,而不需要在发布项目程序中进行界面互动。VC代码
//定义回调函数参数的数据结构struct CALLBACK_PARAM{         DWORDdwProcessId;                                                                //主进程ID         HWNDhMainWnd;                                                                     //主窗口句柄};//枚举窗口的回调函数,用于获取主窗口句柄BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam){         CALLBACK_PARAM *pcp =(CALLBACK_PARAM *)lParam;         DWORD id;         GetWindowThreadProcessId(hWnd,&id);         if((pcp->dwProcessId == id) && (GetParent(hWnd) == NULL))         {                   pcp->hMainWnd= hWnd;                   returnFALSE;         }         return TRUE;}BOOL IspProcess() {         //定义相关变量         STARTUPINFO si;         PROCESS_INFORMATIONpi;         CALLBACK_PARAM cp;         CString path;         //发布项目程序中部分控件的ID         constUINT ID_PROGRAM                  = 1013;         constUINT ID_STOP                   = 1012;         constUINT ID_COMPORT         = 1001;         constUINT ID_PROGRESS      = 1000;         //发布项目程序的完整路径         path =_T("D:\\Work\\Upgrade.exe");         //变量初始化         memset(&si, 0,sizeof(STARTUPINFO));         memset(&pi, 0,sizeof(PROCESS_INFORMATION));         memset(&cp, 0,sizeof(CALLBACK_PARAM));         //设置启动变量         si.cb =sizeof(STARTUPINFO);         GetStartupInfo(&si);         si.wShowWindow= SW_SHOWNORMAL;                               //此处若设置为SW_HIDE,就不会显示发布项目程序//的操作界面,所有的ISP操作都可在后台进行         si.dwFlags =STARTF_USESHOWWINDOW;         //创建发布项目程序进程         if(CreateProcess(NULL, (LPTSTR)(LPCTSTR)path, NULL, NULL, FALSE, 0, NULL, NULL,&si, &pi))         {                  //等待发布项目程序进程初始化完成                   WaitForInputIdle(pi.hProcess,5000);                  //获取发布项目程序的主窗口句柄                   cp.dwProcessId= pi.dwProcessId;                   cp.hMainWnd= NULL;                   EnumWindows(EnumWindowCallBack,(LPARAM)&cp);                   if(cp.hMainWnd != NULL)                   {                            HWNDhProgram;                            HWNDhStop;                            HWNDhPort;                            //获取发布项目程序主窗口中部分控件句柄                            hProgram= ::GetDlgItem(cp.hMainWnd, ID_PROGRAM);                            hStop= ::GetDlgItem(cp.hMainWnd, ID_STOP);                            hPort= ::GetDlgItem(cp.hMainWnd, ID_COMPORT);                            //设置发布项目程序中的串口号, 第3个参数为0:COM1, 1:COM2, 2:COM3, ...                            ::SendMessage(hPort,CB_SETCURSEL, 0, 0);                            //触发编程按钮开始ISP编程                            ::SendMessage(hProgram,BM_CLICK, 0, 0);                            //等待编程完成,                           //由于此处会阻塞主进程,所以建议新建工作进程,在工作进程中进行等待                            while(!::IsWindowEnabled(hProgram));                            //编程完成后关闭发布项目程序                            ::SendMessage(cp.hMainWnd,WM_CLOSE, 0, 0);                   }                  //等待进程结束                   WaitForSingleObject(pi.hProcess,INFINITE);                  //清理工作                   CloseHandle(pi.hThread);                   CloseHandle(pi.hProcess);                   returnTRUE;         }         else         {                   AfxMessageBox(_T("创建进程失败 !"));                   returnFALSE;         }}






电子DIY小家 发表于 2023-4-26 16:14:28

就是典型的不看手册{:titter:}

21cnsound 发表于 2024-1-27 08:33:31

国芯如果能发布一款支持命令行的ISP升级程序就好了,选择串口、波特率、HEX文件以及其他选项都通过命令行参数或者ini配置文件进行。这样第三方应用程序调用的通用性就大大加强、简化了。

1417194770 发表于 2025-1-24 10:46:36

使用第三方应用程序调用STC发布项目程序对单片机进行ISP下载   下载成功或者失败时除了从STC发布项目程序面板上看到是否成功外还有其他办法获取这个信号值么

AI-32位8051 发表于 2025-1-24 16:05:08

1417194770 发表于 2025-1-24 10:46
使用第三方应用程序调用STC发布项目程序对单片机进行ISP下载   下载成功或者失败时除了从STC发布项目程序面 ...
在WaitForSingleObject函数结束后
使用GetExitCodeProcess可以获取返回值
返回值如果是0代表下载正确,否则错误


请教:第三方软件调用发布项目程序
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=13993
(出处: 国芯技术交流网站)


页: [1]
查看完整版本: 第三方应用程序调用STC发布项目程序对单片机进行ISP下载