【发布时间】:2017-07-05 19:48:40
【问题描述】:
谁能帮我理解为什么我在主循环中的 printf 语句什么也没打印?如果我在主循环中添加一个常规的 hello world printf 语句,它也不会向控制台打印任何内容。但是,如果我注释掉打印返回数据的行,这个 hello world 打印语句确实有效。
我尝试了多种在两个函数之间传递字符串数据的方法,但都没有成功。
char * getADCValue()
{
uint8_t id;
int32_t adc;
int32_t volt;
uint8_t i;
uint8_t ch_num;
int32_t iTemp;
uint8_t buf[3];
bcm2835_spi_begin();
bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_LSBFIRST );
bcm2835_spi_setDataMode(BCM2835_SPI_MODE1);
bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_1024);
bcm2835_gpio_fsel(SPICS, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_write(SPICS, HIGH);
bcm2835_gpio_fsel(DRDY, BCM2835_GPIO_FSEL_INPT);
bcm2835_gpio_set_pud(DRDY, BCM2835_GPIO_PUD_UP);
id = ADS1256_ReadChipID();
/*if (id != 3)
{
printf("Error, ASD1256 Chip ID = 0x%d", (int)id);
}
else
{
printf("Ok, ASD1256 Chip ID = 0x%d", (int)id);
}*/
ADS1256_CfgADC(ADS1256_GAIN_1, ADS1256_15SPS);
ADS1256_StartScan(0);
while((ADS1256_Scan() == 0));
adc = ADS1256_GetAdc(0);
volt = (adc * 100) / 167;
buf[0] = ((uint32_t)adc >> 16) & 0xFF;
buf[1] = ((uint32_t)adc >> 8) & 0xFF;
buf[2] = ((uint32_t)adc >> 0) & 0xFF;
iTemp = volt; /* uV */
char * return_data = malloc(1024);
if (!return_data)
return NULL;
sprintf(return_data, "%ld.%01ld V", iTemp /1000000, (iTemp%1000000)/100000);
return return_data;
}
int main()
{
char * returnValue = getADCValue();
printf("Voltage Value: %s", returnValue);
free(returnValue);
return 0;
}
【问题讨论】:
-
您确定
\r字符吗?他们倾向于在行首移动光标,可能会覆盖某些文本。 -
好主意。我尝试将它们从 sprintf 格式中删除,但没有成功。
-
大概你知道你正在泄漏函数返回的内存,因为你没有捕获指针并将它传递给
free()。然而,这不是眼前的问题。你检查内存分配成功了吗?不知何故,这可能是您的问题的一个因素吗?还要注意,序列通常是\r\n而不是\n\r。同样,尚不清楚这可能是问题所在。 -
是的,还没到。我进行了编辑以包括内存清除和检查内存分配。删除了新行并返回。到目前为止还没有运气。
-
您使用
%ld作为格式说明符。你确定int32_t iTemp;是long?
标签: c