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