我正在通过UART从树莓派发送5个字节的数据,并通过dsPIC30F微控制器接收它们。我能够正确地接收数据并将MAXCNT寄存器设置为所需值。但是问题出现在我尝试发送第二个值时。在第一次数据读取后,newResBuffer[]中的值不会改变。
对于指针/数组,我是初学者,但我怀疑我的问题可能在于重置指针的方法。我已经尝试过许多不同的方法,但没有成功。请问我的步骤是否正确?
对于指针/数组,我是初学者,但我怀疑我的问题可能在于重置指针的方法。我已经尝试过许多不同的方法,但没有成功。请问我的步骤是否正确?
#include <string.h>
char newResBuffer[10];
char *nR = newResBuffer;
char *nRreset = NULL;
char rxRead = 0;
int newRes = 0;
int newResFlag = 0;
int j = 0;
int main(void)
{
nRreset = nR; // set reset point at the beginning of newResBuffer[]
while(1)
{
if(U1STAbits.URXDA) // check if there is data available
{
rxRead = U1RXREG & 0xFF; //read data from UART receive register
*nR = rxRead; //store data to first byte of newResBuffer[]
nR++; // increment pointer
j++;
if(j > 4)
{
*nR = '\0'; // null terminate the string
newResFlag = 1; // set the flag that new value is ready to be set
j = 0; // reset count variable
}//if(j>4)
}//if(U1STAbits.URXDA)
if(newResFlag) // has flag been set?
{
sscanf(newResBuffer, "%d", &newRes); // convert string received to an int
MAXCNT = (newRes * 2) - 1; // set MAXCNT register to new value
nR = nRreset; // reset pointer to start of newResBuffer[]
newResFlag = 0; // reset flag
}//if(newResFlag)
}//while(1)
return 0;
}//main()
我用诊断LED做了一些测试,发现newResBuffer[]始终会被重置为我发送的第一个值。即使我尝试在设置新的MAXCNT值后重新初始化数组为所有0,也无济于事。
sscanf(newResBuffer, "%d", &newRes);
是否按照您的预期执行,并且您有一个无限的while
循环。 - sjsamnewResBuffer
而非nR-4
进行sccanf
。 - gudoknR = nRreset;
使得nR
指向了 NULL。这意味着当读取第二个值的第一个字节时,您正在对 NULL 指针进行解引用。我想你的意思是nr = newResBuffer
。 - gudokmain()
函数的第一行是nRreset = nR
,所以当我到达nR = nRreset
这一行时,它会将其设置回新的ResBuffer。 - cjswish