我目前正试图通过在特定点处打印某些变量的值来通过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';
基本上它是分析从在数据到来流的信息。
你如何初始化你的数组? – Fredrik
我怀疑它可能与UART接收器有关。也许剩下的字符串还没有从底层读取。 Rx缓冲区大小是多少?你确定你已经读过UART发送器的所有字节吗? – wyc
即使我在两个单独的printf语句中打印这两个数组,第二个从不正确工作 - 无论哪个是第一个。我试图打印一些大文本,所有的都很好。谢谢你的建议。 –