【问题标题】:Why ROM String is not being passed correctly?为什么没有正确传递 ROM 字符串?
【发布时间】:2013-01-31 01:24:15
【问题描述】:

我正在尝试将字符串传递给函数。我已经阅读了很多关于 C18 中 RAM/ROM 字符串的内容,我的代码看起来还可以,但它不起作用。我的功能是这样的:

int setBluetoothName (static const rom char *name){
    unsigned int n = 0, k = 0;
    char string[27] = {0};    // ATNAME + 20 caracteres de nombre + EOF
    char command[27] = {0};
    _bit state = USART_INT;

    // Deshabilito interrupciones del USART
    USART_INT_DISABLE;
    strcpypgm2ram(&string, &name);

    // Numero de caracteres del nombre
    for (; string[n] != 0x00 ; ++n);
    if(n > 19) return LENGTH_ERROR;     // si me pase de 20 letras es muy largo

    // Configuro el nombre del Bluetooth
    printf("ATNAME%s", &string);

我就是这样使用它的:

setBluetoothName("Brazo");

在 Proteus 中,我看到只有字母“B”被传递,当我将 ROM 字符串复制到 RAM 时,它简直是一团糟(见附图)。 printf() 的输出只是 ATNAME,字符串没有被打印。

我正在使用 C18 v4.40 和 MPLABX v1.41。 非常感谢您的帮助。

【问题讨论】:

    标签: c microchip mplab c18


    【解决方案1】:

    试试:

    strcpypgm2ram(string, name);
    

    printf("ATNAME%s", string);
    

    当你声明一个数组时

    char string[27] = {0};
    

    那么变量string指的是数组的第一个元素的地址,当你声明一个参数比如

    int setBluetoothName (static const rom char *name)
    

    那么name指的是字符串所在的地址。

    当您在其中添加 & 时,您将获得包含数据地址的变量的地址。

    【讨论】:

    • 很好,我不知道:当您在其中添加 & 时,您将获得包含数据地址的变量的地址。那是在 C 中吗?还是只是 C18 标准?我回家后试试看。
    • @Andre -- 是的,当 Dennis Ritchie 定义语言时,它已经成为 C 语言的一个特性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多