2017-06-03 102 views
0

我目前正试图通过在特定点处打印某些变量的值来通过UART调试我的程序。我的问题是打印两个字符数组。我打印它们的顺序似乎对打印效果有影响。阵列的声明在头文件中的结构体作为从输入解析数据后如下 -打印出字符数组时出现意外的行为

//header file 
typedef struct 
{ 
    char latitude[10]; 
    char longitude[11]; 
}NMEA_RMC_t; 

NMEA_RMC_t rmc; 

炭阵列在另一个函数操纵。虽然在程序的其他地方有中断,但它们不会被中断更新。在主代码,如果我打印它们如下 -

//main program loop 
printf("lat: %s \t long: %s \n", rmc.latitude, rmc.longitude); 

输出到终端是这个 -

纬度:50.71735长:

而如果我打印它们在像这样的不同顺序 -

printf("long: %s \t lat: %s \n", rmc.longitude, rmc.latitude); 

我得到这个输出。

长:-001.39118纬度:

另外,如果我分裂打印最大为两个独立的printf语句,仅第一打印语句正确打印字符数组。我以前没有必要在这里寻求帮助,但这让我陷入了一个好的一周。任何帮助将大量赞赏!干杯。

编辑

写入到阵列是这样的方案的一部分。它的纬度和经度阵列基本相同。

/* now we are in first char of latitude */ 

/* copy latitude chars */ 
strlcpy ((char*)lat, (const char*)ptr_to_comma, 10);/*copies most size-1, null terminated*/ //changed 11 to 10 

/* default latitude presentation is ddmm.mmmmm 
    we need to change it to dd.mmmmmmm 
*/ 
unsigned char ind; 
for (ind=0; ind<9; ind++) 
{ 
    if (*ptr_to_comma == '.') 
    { 
     ptr_to_comma++;//step over '.' 
    } 
    if (ind==2) 
    { 
     lat[ind++]='.'; 
    } 
    lat[ind] = *ptr_to_comma; 
    ptr_to_comma++; 
} 
lat[10] = '\0'; //terminate 
/* now lat == dd.mmmmmmm */ 

ptr_to_comma++; /*step over comma to the NS-indicator*/ 

/*catch NorthSouth-indicator and step*/ 
if (*ptr_to_comma == 'N'){ /*if we are in the North*/ 
    sign = '+'; 
    rmc.ns_indicator = 'N'; 
} else if (*ptr_to_comma == 'S'){ /*else we are in the South*/ 
    sign = '-'; 
    rmc.ns_indicator = 'S'; 
} 
ptr_to_comma++;//step over NS-indicator 
ptr_to_comma++;//step over comma to the longitude field 

/* dd.mmmmmmm to dd.ddddddd */ 

_convert_minutes((unsigned char*) lat+3); 

/* copy latitude with sign to the rmc-struct */ 
rmc.latitude[0] = sign; 
strcpy ((char*)rmc.latitude+1, (const char*)lat); 
rmc.latitude[10]='\0'; 

基本上它是分析从在数据到来流的信息。

+1

你如何初始化你的数组? – Fredrik

+0

我怀疑它可能与UART接收器有关。也许剩下的字符串还没有从底层读取。 Rx缓冲区大小是多少?你确定你已经读过UART发送器的所有字节吗? – wyc

+0

即使我在两个单独的printf语句中打印这两个数组,第二个从不正确工作 - 无论哪个是第一个。我试图打印一些大文本,所有的都很好。谢谢你的建议。 –

回答

1

对于%s到正常工作,char阵列必须具有NUL - 终止子\0其表示字符串的结束。

如果你没有留下空间,你的程序的行为是undefined

你需要初始化你自己的数组 - 不要依赖编译器来完成它。

调出你的调试器并检查与rmc关联的内存在printf处。

+0

你会推荐这样的东西吗? rmc.latitude [(sizeof(rmc.latitude)-1)] ='\ 0'; –

+0

就我个人而言,我会将整个阵列置于安全的一边,至少在第一时间, – Bathsheba

0

将代码转换为字符串并将它们放入结构中时,无意中在rmc.longitude的开头处放置了'\ 0'字符。代码然后继续填充数组的其余部分,但是printf()函数将rmc.longitude视为零长度字符串,并忽略后面的内容。

这是一个错误的错误。 rmc.latitude[10]='\0';rmc.latitude数组的第11位中放置了0,但是这个数组被声明只有10个位置。实际发生的是rmc.longitude[0]正在获取'\ 0'字符,因为它在内存中相邻。

相关问题