【问题标题】:Simulink Error S-function Escaped character \D is not ValidSimulink 错误 S-Function 转义字符 \D 无效
【发布时间】:2018-08-28 19:18:43
【问题描述】:

我最近在 Simulink 中遇到了这个奇怪的错误,我找不到任何相关信息。

Matlab 版本:2018a 操作系统:Windows 10

gpio_in.c 是使用 s-function 构建器生成的 s-function 的代码。我自己的代码位于相关的包装文件 gpio_in_wrapper.c 中。 s-function builder 设置为只保存代码而不是构建它。我在以后通过 Simulink 编码器部署时使用此文件进行硬件交互。

每当我尝试启动仿真时,Simulink 都会向我显示上述错误,我不知道问题可能是什么。在我看来 D: 是文件路径的开头,特别是如果您考虑上面的警告 \D 并且可能是模型目录的开头 D:\Dateien\Git_Repositories\BMaS_Neu\Simulink

UnbearableLightness 建议的 gpio_in_wrapper.c 内容

/*
 * Include Files
 *
 */
#if defined(MATLAB_MEX_FILE)
#include "tmwtypes.h"
#include "simstruc_types.h"
#else
#include "rtwtypes.h"
#endif

/* %%%-SFUNWIZ_wrapper_includes_Changes_BEGIN --- EDIT HERE TO _END */
#include <gpio.h>
/* %%%-SFUNWIZ_wrapper_includes_Changes_END --- EDIT HERE TO _BEGIN */
#define u_width 1
#define y_width 1

/*
 * Create external references here.  
 *
 */
/* %%%-SFUNWIZ_wrapper_externs_Changes_BEGIN --- EDIT HERE TO _END */

/* %%%-SFUNWIZ_wrapper_externs_Changes_END --- EDIT HERE TO _BEGIN */

/*
 * Output function
 *
 */
void gpio_in_Outputs_wrapper(const int32_T *port_popupvalue,
                             const int32_T *pin_number,
                             boolean_T     *gpio_in)
{
    /* %%%-SFUNWIZ_wrapper_Outputs_Changes_BEGIN --- EDIT HERE TO _END */
    if (*port_popupvalue == 1) {
        *gpio_in = HAL_GPIO_ReadPin(GPIOA, (1 << *pin_number));
    } else if (*port_popupvalue == 2) {
        *gpio_in = HAL_GPIO_ReadPin(GPIOB, (1 << *pin_number));
    } else if (*port_popupvalue == 3) {
        *gpio_in = HAL_GPIO_ReadPin(GPIOC, (1 << *pin_number));
    } else if (*port_popupvalue == 4) {
        *gpio_in = HAL_GPIO_ReadPin(GPIOD, (1 << *pin_number));
    } else if (*port_popupvalue == 5) {
        *gpio_in = HAL_GPIO_ReadPin(GPIOE, (1 << *pin_number));
    } else if (*port_popupvalue == 6) {
        *gpio_in = HAL_GPIO_ReadPin(GPIOF, (1 << *pin_number));
    } else if (*port_popupvalue == 7) {
       *gpio_in = HAL_GPIO_ReadPin(GPIOG, (1 << *pin_number));
    } else if (*port_popupvalue == 8) {
       *gpio_in = HAL_GPIO_ReadPin(GPIOH, (1 << *pin_number));
    } else if (*port_popupvalue == 9) {
       *gpio_in = HAL_GPIO_ReadPin(GPIOI, (1 << *pin_number));
    }
    /* %%%-SFUNWIZ_wrapper_Outputs_Changes_END --- EDIT HERE TO _BEGIN */
}

我会很感激你的每一个暗示。

【问题讨论】:

  • 分享您的代码。错误告诉您 \D 对您的代码可能正在使用的函数 sprintf 无效。
  • 如果您无法共享您的代码,请执行 dbstop in sprintf 并尝试找到对 sprintf 的调用,该调用在格式说明符中传递了带有 \D 的内容。如果在 MathWorks 代码中,请通过MathWorks technical support 报告
  • @UnbearableLightness 哪些文件对您有帮助?各自的c源文件?这是一个学生项目,所以我可以分享你想要的任何东西。
  • @Simon 感兴趣的源文件是gpio_in_wrapper.c
  • @UnbearableLightness 已将其添加到问题中。

标签: matlab simulink


【解决方案1】:

我认为正在发生的事情是您的代码正在从 D 驱动器上的路径访问某些内容。例如,如果路径名是'D:\Somedirectory\Somefile',有时它会将'\S' 视为转义序列并抛出错误。解决方案是将 '\' 替换为 '\\',即'D:\\Somedirectory\\Somefile'

根据错误,它已经转义了'\D',这意味着目录或文件名的第一个字母以'D'开头。

正如 Cris Luengo 在他的评论中提到的那样,您应该检查 m 文件,您可能会在该文件中找到使用路径的代码部分。
命令窗口还有错误文本吗?

【讨论】:

  • 模型目录实际上是D:\Dxxxxx ...,但我不知道您可能指的是哪些m文件。命令窗口上也没有打印任何内容。
猜你喜欢
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2022-01-22
相关资源
最近更新 更多