我目前正試圖通過在特定點處打印某些變量的值來通過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語句中打印這兩個數組,第二個從不正確工作 - 無論哪個是第一個。我試圖打印一些大文本,所有的都很好。謝謝你的建議。 –