找回密码
 立即注册
查看: 2553|回复: 6

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:433
  • 最近打卡:2025-04-30 07:30:29
已绑定手机

229

主题

328

回帖

1467

积分

金牌会员

积分
1467
发表于 2023-4-26 14:08:57 | 显示全部楼层 |阅读模式
第三方应用程序调用STC发布项目程序对单片机进行ISP下载, 可以吗
4045JRRYD(1CAV9RHN)JONT.png
我的设备有一套自己的上位机软件,我是想程序升级直接用我的上位机完成升级,
不需要再让我司的用户再去打开另外一个,STC帮我们发布的虽然也是我们用户自己界面的软件去升级,
如果发布项目程序能内嵌到我们用户的专有的上位机进行升级,我们用户就会更方便了


点评

可以  发表于 2023-4-26 16:02
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15609
发表于 2023-4-26 16:01:39 | 显示全部楼层
可以

1.png

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







回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-4-26 16:14:28 | 显示全部楼层
就是典型的不看手册
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:452
  • 最近打卡:2025-05-01 06:20:50
已绑定手机

13

主题

1257

回帖

2971

积分

金牌会员

积分
2971
发表于 2024-1-27 08:33:31 | 显示全部楼层
国芯如果能发布一款支持命令行的ISP升级程序就好了,选择串口、波特率、HEX文件以及其他选项都通过命令行参数或者ini配置文件进行。这样第三方应用程序调用的通用性就大大加强、简化了。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-02-05 11:05:11
已绑定手机

2

主题

2

回帖

22

积分

新手上路

积分
22
发表于 2025-1-24 10:46:36 | 显示全部楼层
使用第三方应用程序调用STC发布项目程序对单片机进行ISP下载   下载成功或者失败时除了从STC发布项目程序面板上看到是否成功外还有其他办法获取这个信号值么

点评

在WaitForSingleObject函数结束后 使用GetExitCodeProcess可以获取返回值 返回值如果是0代表下载正确,否则错误  详情 回复 发表于 2025-1-24 16:05
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2025-04-30 10:59:33

25

主题

1154

回帖

2391

积分

超级版主

积分
2391
发表于 2025-1-24 16:05:08 | 显示全部楼层
14171*** 发表于 2025-1-24 10:46
使用第三方应用程序调用STC发布项目程序对单片机进行ISP下载   下载成功或者失败时除了从STC发布项目程序面 ...

在WaitForSingleObject函数结束后
使用GetExitCodeProcess可以获取返回值
返回值如果是0代表下载正确,否则错误


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


STC官网:https://www.stcai.com/
QQ:2593903262
微信号:18106296598
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:44 , Processed in 0.453811 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表