C 重置指向字符数组的指针

C 重置指向字符数组的指针,c,arrays,pointers,C,Arrays,Pointers,我正在从Rasp发送5字节的数据。Pi,并通过使用UART的dsPIC30F微控制器接收它们。我可以正确接收数据,并将MAXCNT寄存器设置为所需的值。当我尝试发送第二个值时,问题就出现了。首次读取数据后,newResBuffer[]中的值不会更改 我是指针/数组的初学者,但我怀疑我的问题可能在于重置指针的方法。我尝试过许多不同的方法,但都没有成功。我是否正确执行此步骤 #include <string.h> char newResBuffer[10]; char *nR = ne

我正在从Rasp发送5字节的数据。Pi,并通过使用UART的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()
#包括
char-newResBuffer[10];
char*nR=newResBuffer;
char*nRreset=NULL;
字符rxRead=0;
int-newRes=0;
int newResFlag=0;
int j=0;
内部主(空)
{
nRreset=nR;//在newResBuffer[]的开头设置重置点
而(1)
{
if(U1STAbits.URXDA)//检查是否有可用数据
{
rxRead=U1RXREG&0xFF;//从UART接收寄存器读取数据
*nR=rxRead;//将数据存储到newResBuffer[]的第一个字节
nR++;//增量指针
j++;
如果(j>4)
{
*nR='\0';//null终止字符串
newResFlag=1;//设置新值准备好设置的标志
j=0;//重置计数变量
}//如果(j>4)
}//if(U1STAbits.URXDA)
if(newResFlag)//是否已设置标志?
{
sscanf(newResBuffer、%d、&newRes);//将接收到的字符串转换为整数
MAXCNT=(newRes*2)-1;//将MAXCNT寄存器设置为新值
nR=nRreset;//重置指向newResBuffer开始的指针[]
newResFlag=0;//重置标志
}//if(newResFlag)
}//而(1)
返回0;
}//main()

我用诊断指示灯做了一些测试,看起来newResBuffer[]一直被重置为我发送的第一个值。在设置新的MAXCNT值后,我甚至尝试将数组重新初始化为所有0,但没有效果。

您重置指针的方法是正确的,尽管有一些更简单的方法可以实现。我假设您的错误一定与设置MAXCNT寄存器或从接收寄存器读取新数据有关。我对Raspberry Pi微控制器了解不多,无法帮助您实现这一点,但在将MAXCNT寄存器更新为新值之前,您可能需要刷新或刷新MAXCNT寄存器

我通过用标准C函数替换Raspberry Pi特定寄存器的用法来测试您的代码,该函数用于从stdin读取并打印到
stdout
。很容易测试并看到代码中涉及接收单个字符数字、将其存储在字符串缓冲区中、将该缓冲区转换为int以及重用缓冲区的部分都是正确的。下面是我的代码,显示了正确读取的值,并显示了一些附加信息,以确认缓冲区地址已正确递增和重置:

#include <string.h>
#include <stdlib.h>
#include <stdio.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;

    /* Printing out initial memory addresses */
    printf("newResBuffer address: %p\n", (void *) newResBuffer);
    printf("Initial nRreset address: %p\n", (void *) nRreset);
    printf("Initial nR address: %p\n\n", (void *) nR);

    while(1)
    {
        /* Using rand() % 2 to simulate data availability */
        if(rand() % 2)
        {
            /* Using getc() instead of the register to read individual digits */
            rxRead = getc(stdin);
            printf("rxRead: %c saved to nR address %p\n", rxRead, (void *) nR);
            *nR = rxRead;
            nR++;
            j++;

            if(j > 4)
            {
                *nR = '\0';
                newResFlag = 1;
                j = 0;
            }
        }

        if(newResFlag)
        {
            sscanf(newResBuffer, "%d", &newRes);
            /* Printing newRes and MAXCNT instead of setting the register */
            printf("newRes: %d\n", newRes);
            printf("MAXCNT: %d\n", (newRes * 2) - 1);
            printf("nR address before reset: %p\n", (void *) nR);
            nR = nRreset;
            printf("nR address after reset: %p\n\n", (void *) nR);
            newResFlag = 0;
        }
    }

    return 0;
}

不确定
sscanf(newResBuffer、%d、&newRes)
正在做你想让它做的事情,你有一个无限的
,而
循环无限的,而循环就是我想要的。至于sscanf(),我希望将字符串(例如newResBuffer={'1'、'2'、'3'、'4'、'5'、'\0'})转换为int(例如12345)。这是错误的做法吗?显示变量声明。目前,您正在从
newResBuffer
调用
sscanf,而不是
nR-4
。@gudok I已更改为sscanf(nR-5、%d、&newRes)。。。仍然无法正常工作。此分配
nR=nRreset使
nR
指向空。这意味着,当读取第二个值的第一个字节时,将取消对空指针的引用。我想你的意思是
nr=newResBuffer
。谢谢你的详细回复。我完全不使用指针,只使用计数器变量j引用数组位置。看起来我的原始代码工作正常(在我的微控制器代码中发现另一个错误,接收缓冲区获取的数据太多,我从未清除溢出错误标志),但我觉得我更新的代码现在更平滑了。谢谢
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main(void) {
    char newResBuffer[10];
    char rxRead = 0;
    int newRes = 0;
    int newResFlag = 0;
    int j = 0;

    while (1) {
        /* if (U1STAbits.URXDA) { */
        if (rand() % 2) {
            /* rxRead = U1RXREG & 0xFF; */
            rxRead = getc(stdin);
            newResBuffer[j++] = rxRead;

            if (j > 4) {
                newResBuffer[j] = '\0';
                newResFlag = 1;
                j = 0;
            }
        }

        if (newResFlag) {
            newRes = atoi(newResBuffer);
            /* MAXCNT = (newRes * 2) - 1; */
            printf("newRes: %d\n", newRes);
            printf("MAXCNT: %d\n", (newRes * 2) - 1);
            newResFlag = 0;
        }
    }

    return 0;
}