国学芯用 发表于 2023-4-26 16:29:18

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

本帖最后由 国学芯用 于 2023-4-28 08:45 编辑


附录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;
         }
}


weavr 发表于 2023-4-26 18:44:13

这个不错,STC-ISP软件也可以出个类似的接口给第三方烧录软件调用啊,这样就不用公开烧录协议了。

国学芯用 发表于 2023-4-28 09:33:31

weavr 发表于 2023-4-26 18:44
这个不错,STC-ISP软件也可以出个类似的接口给第三方烧录软件调用啊,这样就不用公开烧录协议了。 ...
(引用自2楼)

国学芯用 发表于 2023-4-28 09:34:29

国学芯用 发表于 2023-4-28 09:33

(引用自3楼)

参考代码见数据手册-附录Q https://www.stcai.com/filedownload/686716
页: [1]
查看完整版本: 第三方应用程序调用STC发布项目程序对单片机进行ISP下载