2017-06-03 120 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'字符,因爲它在內存中相鄰。

相關問題