C18将char数组传递给函数

用户名

我是C编程和微控制器的新手。我正在使用带有C18的PIC18F24K20单片机。我已将其设置为使用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”,就好像微控制器运行了CommTransmit函数一样。但是,它从不传输“ g”。即使我在ifTrans语句之外和之后在CommTransmit函数中放置了USART_transmit('g')调用,也始终不会调用它(就像它卡在strcmppgm2ram函数中一样?),但它仍会传输't'。

这也很奇怪,因为如果我在CommTransmit函数上稍作休息并逐行运行,它似乎可以正常工作。但是,如果我在MPLAB IDE中观看CommVariable,那绝对不是它应该的样子(尽管在调用函数之前的'buf'变量是正确的)。据我所知,当我观看CommVariable时,它的值取决于数组的大小。

从阅读的角度来看,我认为这可能是由微控制器如何存储变量(程序还是数据存储器?)引起的,但我不确定。任何帮助是极大的赞赏!

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

pmod

寻找strcmppgm2ram的签名

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

我不明白您为什么要CommVariable使用rom char *从章2.4.3 RAM / ROM预选赛MPLAB®C18 C编译器用户指南

由于PICmicro单片机在设计中使用单独的程序存储器和数据存储器地址总线,因此MPLAB C18需要扩展以区分位于程序存储器中的数据和位于数据存储器中的数据。/ --- /指针可以指向数据存储器(ram指针)或程序存储器(rom指针)。除非声明为rom,否则将指针视为ram指针。

2.7.3字符串常量中

MPLAB C18的单独地址空间的一个重要结果是,程序存储器中的数据指针与数据存储器中的数据指针不兼容。/ --- /,因为它们引用不同的地址空间。/ --- / MPLAB C18自动将所有字符串常量放入程序存储器。字符串常量的这种类型是“位于程序存储器中的char数组”(const rom char [])

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将char数组传递给函数C ++

来自分类Dev

将char数组的数组传递给函数

来自分类Dev

将char数组的数组传递给函数

来自分类Dev

C编程,将char数组传递给函数

来自分类Dev

将指针传递给char数组作为函数的参数-C

来自分类Dev

无法将char数组传递给函数

来自分类Dev

将char指针数组传递给函数

来自分类Dev

将char数组的指针传递给函数

来自分类Dev

将char指针数组传递给函数

来自分类Dev

将char数组传递给函数

来自分类Dev

将char指针/数组传递给函数

来自分类Dev

将char指针传递给C函数

来自分类Dev

将char *传递给C中的函数后,如何指向预期的char数组?

来自分类Dev

将char *传递给C中的函数后,如何指向预期的char数组?

来自分类Dev

将char数组传递给函数内的struct数组

来自分类Dev

C ++直接将数组传递给函数

来自分类Dev

将数组传递给C中的函数

来自分类Dev

将C数组传递给Rust函数

来自分类Dev

C ++将指针数组传递给函数

来自分类Dev

将数组传递给类函数C ++

来自分类Dev

如何将Swift字符串数组传递给带有char **参数的C函数

来自分类Dev

如何将char数组作为字节从C JNI函数传递给Java方法[]

来自分类Dev

OpenvVMS从pascal将char参数数组传递给C函数

来自分类Dev

如何将char数组从C JNI函数作为字节传递给Java方法[]

来自分类Dev

如何在C中将char数组传递给函数

来自分类Dev

如何从C#将const char *传递给C函数?

来自分类Dev

将数组传递给函数

来自分类Dev

将数组传递给函数

来自分类Dev

将const char *传递给C中的函数