我是C编程和微控制器的新手。我使用的是PIC18F24K20微控制器和C18。我有设置,以接收信息从计算机输入使用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‘。即使我将一个USART_transmit('g')调用放在CommTransmit函数中,在if语句之外和之后,它也不会被调用(就像它卡在strcmppgm2ram函数中一样?)但它仍在传输“t”。
这也很奇怪,因为如果我中断了CommTransmit函数并逐行运行,它似乎会正常工作。但是,如果我在MPLAB中查看CommVariable,它永远不会是它应该是的(尽管在被调用到函数之前'buf‘变量是正确的)。据我所知,CommVariable的值取决于数组的大小。
从阅读上看,我认为这可能是由于微控制器如何存储变量(程序还是数据存储器?)但我不确定。任何帮助都是非常感谢的!
编辑:我还应该补充一点,如果我在CommTransmit行之前的are语句中取消了T=CommTransmit行的注释,它就会正常工作(当两个字符串相同时,T=0)。我相信当我通过函数传递数组时,数组会发生变化,这会导致strcmppgm2ram函数不能正常工作。
发布于 2014-06-23 23:10:55
查看strcmppgm2ram的签名
signed char strcmppgm2ram(const char * str1, const rom char * str2 );我不明白为什么你有CommVariable的rom char *。来自2.4.3ram/rom限定符 of C18 C编译器用户指南
由于PICmicro微控制器在设计中使用独立的程序存储器和数据存储器地址总线,因此C18需要扩展以区分位于程序内存中的数据和位于数据存储器中的数据。/-/指针可以指向数据内存(ram指针)或程序内存(rom指针)。除非声明为rom.,否则假定指针是ram指针。
在2.7.3字符串常量中,
MPLAB C18的独立地址空间的一个重要后果是程序内存中的数据指针和数据内存中的数据指针不兼容。/-因为它们指的是不同的地址空间。/-/ MPLAB C18自动将所有字符串常量放入程序内存中。这种类型的字符串常量是“程序内存中的char数组”,(const [])。
此外,还不清楚第二个参数的类型转换到、const、rom char*的目的。这可能会导致堆栈损坏,因为far指针的大小更大(24位)。因此,它看起来应该重写为:
void CommTransmit (const char *CommVariable )
{
if (!strcmppgm2ram(CommVariable, "test")) {
USART_transmit('g');
}
}https://stackoverflow.com/questions/22989620
复制相似问题