我是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函数无法正常工作。
寻找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] 删除。
我来说两句