C18 将 char 数组传递给函数

标签 c arrays embedded pic18 mplab-c18

我是 C 语言编程和微 Controller 的新手。我正在使用带有 C18 的 PIC18F24K20 微 Controller 。我将其设置为使用 USART 传输和接收功能从计算机输入接收信息。我的目标是将接收到的单词与已知单词进行比较,并根据接收到的单词将某些内容传回计算机。下面是相关代码。

#include "p18f24k20.h"
#include "delays.h"
#include "string.h"
#include "stdlib.h"


void CommTransmit ( rom char * );

void main (void)
{
    char buf[11], data, T;
    int i;

    i = 0;
    memset(buf, 0, sizeof buf);

    while(1)
    {
        if (PIR1bits.RCIF)
        {
            data = USART_receive();
            if (data != 47)             // 47 is /, indicates end of string
            {
                buf[i] = data;
                i++;
            }
            else
            {
                // T = strcmppgm2ram(buf,(const far rom char*)"test");
                CommTransmit(buf);
                USART_transmit('t');
                buf[0] = 0'
            }
        }
    }
}


void CommTransmit ( rom char *CommVariable )
{
    char test;

    test = strcmppgm2ram(CommVariable, (const far rom char*)"test");
    if (test == 0)
    {
        USART_transmit('g');
    }
}

代码当前设置为测试以确定错误所在。如果我按原样运行它,计算机将收到一个“t”,就好像微 Controller 通过 CommTransmit 函数运行一样。但是,它从不传输“g”。即使我在 CommTransmit 函数中调用 USART_transmit('g'),在 if 语句之外和之后,它也永远不会被调用(就像它卡在 strcmppgm2ram 函数中一样?)但它仍然传输“t”。

这也很奇怪,因为如果我在 CommTransmit 函数处打断并逐行运行,它似乎可以正常工作。但是,如果我在 MPLAB IDE 中观察 CommVariable,它永远不是它应该的样子(尽管在调用函数之前的“buf”变量是正确的)。据我所知,我观察时 CommVariable 的值取决于数组的大小。

根据阅读,我认为这可能是由微 Controller 存储变量的方式(程序还是数据存储器?)引起的,但我不确定。非常感谢任何帮助!

编辑:我还应该补充一点,如果我在 CommTransmit 行之前的 else 语句中取消注释 T = strcmppgm2ram 行,它会正常工作(当两个字符串相同时 T = 0)。我相信当我通过函数传递数组时数组会发生变化,这会导致 strcmppgm2ram 函数无法正常工作。

最佳答案

查看 strcmppgm2ram 的签名

signed char strcmppgm2ram(const char * str1, const rom char * str2 );

我不明白你为什么要为 CommVariable 使用 rom char *。摘自 MPLAB® C18 C Compiler User’s Guide2.4.3 ram/rom 限定词

Because the PICmicro microcontrollers use separate program memory and data memory address busses in their design, MPLAB C18 requires extensions to distinguish between data located in program memory and data located in data memory. /---/ Pointers can point to either data memory (ram pointers) or program memory (rom pointers). Pointers are assumed to be ram pointers unless declared as rom.

并且在2.7.3 字符串常量中:

An important consequence of the separate address spaces for MPLAB C18 is that pointers to data in program memory and pointers to data in data memory are not compatible. /---/ because they refer to different address spaces. /---/ MPLAB C18 automatically places all string constants in program memory. This type of a string constant is “array of char located in program memory”, (const rom char []).

而且还不清楚将第二个参数类型转换为 const far rom char* 的目的。这可能会导致堆栈损坏,因为远指针的大小更大(24 位)。所以,它看起来应该重写为:

void CommTransmit (const char *CommVariable )
{
    if (!strcmppgm2ram(CommVariable, "test")) {
         USART_transmit('g');
    }
}

关于C18 将 char 数组传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22989620/

相关文章:

c - 如何在 C 程序中修复输出控制台窗口的大小/形状?

java - 数组引用

embedded - Ada 中的信号量

c - 正确关闭 PIC12F675 上的 ADC

c - 互斥体的 getter 和 setter 最佳实践

c - API 和 "-ldllname"编译器选项的运行时链接

c++ - 如何使用 C/C++ 和 SDL2 将文件字体加载到 RAM 中?

cudaMemcpy 没有将主机矩阵复制到设备(给出段错误)

c# - 拆分逗号分隔的字符串,同时删除空格和空条目

php - undefined offset : 0 error when using inval() converted indexes