簡體   English   中英

C ++ Eclipse控制台將純文本編碼為其他字符

[英]C++ Eclipse console encoding plain text as other characters

我有一個英特爾愛迪生運行從一個串口讀取GPS的一些數據的C ++程序和呼應回控制台。

這部分工作正常,但是當琴弦在控制台讀取他們的字符不應該在那里,像“¬é”。 我猜的東西是搞砸了與Eclipse控制台/ G ++編碼,並認為一些讀數是字符代碼。

以下是Eclipse控制台的一些輸出:

$GPVTG,,T,,M,0.041,N,0.075,K,A*24
$GPGGA,225153.00,5206.75433,N,12206.88881,W,1,10,1.03,582.1,M,-15.6,M,,*6F
$GPGSA,A,3,32,02,12,14,24,06,03,19,17,25,,,1.84,1.03,1.53*05
$GPGSV,3,1,11,¬é­N
-> 02,51,176,30,03,10,027,17,06,60,088,33,12,68,295,36*79
$GPGSV,3,2,11,14,10,316,30,17,20,072,27,19,45,069,40,24,36,215,35*7E
$GPGSV,3,3,11,25,29,301,28,29,05,254,,32,07,305,33*40
$GPGLL,5206.75433,N,12206.88881,W,225153.00,A,A*78
.53*05
$GPGSV,3,1,11,¬é­N

這里是一些輸出的直接從愛迪生(串口讀取cat /dev/ttyMFD1 ):

$GPVTG,,T,,M,0.048,N,0.090,K,A*26
$GPGGA,225407.00,5206.75339,N,12206.88816,W,1,10,1.02,584.2,M,-15.6,M,,*6C
$GPGSA,A,3,32,02,12,14,24,06,03,19,17,25,,,1.80,1.02,1.49*0B
$GPGSV,3,1,11,02,52,176,15,03,10,026,20,06,59,086,29,12,69,295,41*76
$GPGSV,3,2,11,14,09,316,29,17,19,072,29,19,44,070,34,24,35,215,32*74
$GPGSV,3,3,11,25,30,301,29,29,06,254,,32,06,304,17*4C
$GPGLL,5206.75339,N,12206.88816,W,225407.00,A,A*7F
$GPRMC,225408.00,A,5206.75337,N,12206.88814,W,0.058,,170616,,,A*6F

我嘗試了運行配置“公共”選項卡中所有可用的編碼選項,但它們都產生了奇怪的結果,甚至是漢字!

相關代碼是char array[255]; 初始化緩沖區,然后將串行數據讀入緩沖區並將其輸出到控制台:

while(true){
    dev->read(array,255);
    std::cout<<"-> "<<array<<std::endl;
}

鑒於此塊:

-> 02,51,176,30,03,10,027,17,06,60,088,33,12,68,295,36*79
$GPGSV,3,2,11,14,10,316,30,17,20,072,27,19,45,069,40,24,36,215,35*7E
$GPGSV,3,3,11,25,29,301,28,29,05,254,,32,07,305,33*40
$GPGLL,5206.75433,N,12206.88881,W,225153.00,A,A*78
.53*05
$GPGSV,3,1,11,¬é­N

添加rn代表CRLF的兩個字符,該字符終止一行NMEA數據,然后僅計算我得到的垃圾之間的字符數

  0123456789ABCDEF
0 02,51,176,30,03,
1 10,027,17,06,60,
2 088,33,12,68,295
3 ,36*79rn$GPGSV,3
4 ,2,11,14,10,316,
5 30,17,20,072,27,
6 19,45,069,40,24,
7 36,215,35*7Ern$G
8 PGSV,3,3,11,25,2
9 9,301,28,29,05,2
A 54,,32,07,305,33
B *40rn$GPGLL,5206
C .75433,N,12206.8
D 8881,W,225153.00
E ,A,A*78rn.53*05r
F n$GPGSV,3,1,11,

255個字符

正是其中之一:

dev->read(array,255);

廉價的黑客是為了

char array[256];

接着

dev->read(array,sizeof(array)-1);
array[sizeof(array)-1] = '\0';

但我認為您最好使用以下方法:

int len = receiveUntil(array,sizeof(array), "\r\n")
if (len >= 0)
{
    // checksum and parse
}
discardUntil ("$");

哪里

receiveUntil將進入的流讀入array直到找到NMEA句子的末尾,然后null終止array並返回讀取的字節數或array即將溢出,在這種情況下,它返回-1。

discardUntil丟棄所有內容,直到找到NMEA起始字符“ $”

帶有將在找到$時重置array的函數來替換receiveUntil獎勵點,因此您不會錯過任何尚未損壞的消息。

事實證明,這與編碼無關。 當我嘗試使用NodeJS進行相同的操作並返回相同的輸出時,我開始意識到這是另一回事。

我忘記了從此GPS模塊讀取輸出的正確方法是一次讀取一個字符,直到您擊中行尾的換行符為止, 然后使用它/將其記錄到控制台。

所以我的代碼變成了:

char array[255];
char c[1];
int i = 0;

while(true){
     dev->read(c,1);

     if(c[0] == '\n'){
         i = 0;

         std::cout<<"-> "<<array<<std::endl;

         char *begin = array;
         char *end = begin + sizeof(array);
         std::fill(begin, end, 0);
     }else{
         array[i] = c[0];
         ++i;
     }
}

現在可以完美工作了:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM