第三方应用程序调用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;
}
}
这个不错,STC-ISP软件也可以出个类似的接口给第三方烧录软件调用啊,这样就不用公开烧录协议了。 weavr 发表于 2023-4-26 18:44
这个不错,STC-ISP软件也可以出个类似的接口给第三方烧录软件调用啊,这样就不用公开烧录协议了。 ...
(引用自2楼)
国学芯用 发表于 2023-4-28 09:33
(引用自3楼)
参考代码见数据手册-附录Q https://www.stcai.com/filedownload/686716
页:
[1]