c#读取编程区数据

使用ST提供的API对单片机数据区的内容进行读取,本文是对一些操作进行解释。


1、概述

由于ST官方提供的API是封装在C/C++程序集dll中的,对相关函数的调用需要在C/C++的环境中使用,使用C#.NET编写的上位机调用上述dll需要很繁琐的调用规则,所以我们使用另一种思路,直接使用ST提供的例程源码,在其中加入所需要的函数,然后编译成可执行文件,再使用C#调用可执行文件,完成相关功能。

2、编程手册介绍

编程手册为文件夹中的stvp_programming_toolkit.pdf,它的目录如下图:

第二章介绍了他的例程结构。
第三章介绍调用函数所需要的DLL库,我们可以将生成的可执行文件放在stvp的目录下,在此目录下包含了我们需要的所有DLL程序集。
第四第五章介绍了他所支持功能对应的函数

其中红线标识的第二章介绍了它的例程结构,其中包含两个工程ApiSample和MFCSample,我们不需要图形界面,所以只修改ApiSample

3、功能扩充方法

  • 打开例程
    打开APISample.dsp,因为提供的原始例程是VC++6.0的工程,现使用VS2017打开,运行过程若出现问题,请自行百度。
  • 添加函数
    根据编程手册的描述,保存存储区的数据需要使用ESaveFile函数,描述如下:

    传入的参数需要一个FileNamedwAreaId前者是保存在当前目录下文件名,后者是要保存的具体区域,获得具体区域的特定ID需要函数EGetId描述如下:

    所以我们在工程中使用这两个函数就可以实现对特定区域的数据的存储。
    mian.cpp中加入一个函数:
BOOL Save(const char* FileName ,const char *szAreaName)
{
    int iReturn;
    unsigned long iAreaId;
    if ((iReturn = EGetId(szAreaName, &iAreaId)) == 1)
    {
        iReturn = ESaveFile(FileName, iAreaId);
    }
    else
    {
        LDisplayError("保存文件出错");
    }
    return(iReturn == 1);
}//cpp

并在满足存储条件时调用这个函数:

    if (b_MemSave)//存储PROGRAM MEMORY
    {
        LDisplayMessage("\n>>> Save PROGRAM MEMORY");
        if (Save(SaveProgFileName, "PROGRAM MEMORY") != TRUE)
        {
            LDisplayMessage("<<< Save PROGRAM MEMORY fails");
        // Close Communication, Close log file if opened & Unload the API DLLs
            CloseComm_CloseLog_Clean(b_Log);
            return 1; // Prog Error
        }
        else
        {
            LDisplayMessage("<<< Save PROGRAM MEMORY succeeds");
        }
    }//cpp
    if (b_DataSave)//存储DATA MEMORY
    {
        LDisplayMessage("\n>>> Save DATA MEMORY");
        if (Save(SaveDataFileName, "DATA MEMORY") != TRUE)
        {
            LDisplayMessage("<<< Save DATA MEMORY fails");
            // Close Communication, Close log file if opened & Unload the API DLLs
            CloseComm_CloseLog_Clean(b_Log);
            return 1; // Prog Error
        }
        else
        {
            LDisplayMessage("<<< Save DATA MEMORY succeeds");
        }
    }//cpp

我们可以在原有的调用规则上边新添加两个命令,传参进去。此处添加如下两个命令:
[-saveData] =================> Save DATA MEMORY
[-saveProg] =================> Save PROGRAM MEMORY

关于如何传参进去,让这两个函数执行,可以阅读源程序,很简单,此处不赘述。
* 编译
在主函数相关位置添加必要的参数,编译。(暂时不能运行,要在有st提供的完整的程序集的环境下才能运行)生成可执行文件STVP_CmdLine,这是一个命令窗口程序,我们可以传参进去,因此可以在c#工程中调用这个命令窗口程序。这样就完成了功能扩展。

4、C#中调用

C#中我们用Process类的相关方法调用命令窗口程序,使用我们上文编译的文件STVP_CmdLine时,一定要放到stvp的目录下,其中包含了我们需要的dll。

private static void stvpTest()
{
    string stvp_path = ".\\stvp\\STVP_CmdLine.exe";

    StringBuilder argv = new StringBuilder("-BoardName=ST-LINK -Port=USB -ProgMode=SWIM -Device=STM8L151x3 -progress -no_loop -readData -saveData");
    StringBuilder cmd = new StringBuilder("-BoardName=ST-LINK -Port=USB -ProgMode=SWD -Device=STM32F103xC -progress -no_loop  -readProg -saveProg");//stlink 命令行

    Process prosec = new Process();
    prosec.StartInfo.FileName = stvp_path;
    prosec.StartInfo.Arguments = argv.ToString();
    prosec.Start();
    prosec.WaitForExit();
    Console.WriteLine("返回值是:" + prosec.ExitCode);
}//c#

关于Process类的详细使用请阅读MSDN的技术文档。

猜你喜欢

转载自blog.csdn.net/crookshanks_/article/details/78646600