C 日食控制台编码纯文本作为其他字符
C++ Eclipse console encoding plain text as other characters
我在英特尔爱迪生(Intel Edison)上运行了一个C 程序,从串行端口读取一些GPS数据并将其回声回到控制台。
那部分工作正常,但是当在控制台中读取字符串时,它们的角色不应该在那里,例如"€"。我猜想在Eclipse Console/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] = ' ';
,但我认为您对这样的事情更好:
int len = receiveUntil(array,sizeof(array), "rn")
if (len >= 0)
{
// checksum and parse
}
discardUntil ("$");
其中
receiveUntil
将传入流读取到array
中,直到找到NMEA句子的结尾,然后null终止array
并返回字节读取或array
即将溢出,在这种情况下,它返回-1。
discardUntil
扔掉了所有东西,直到找到nmea start arnect'$'
用array
替换CC_9的奖励点,当它找到CC_9时,您不会错过任何尚未损坏的消息。
事实证明,编码不是问题。我开始意识到,当我尝试使用nodejs做同样的事情并获得相同的输出时,这是其他事情。
我忘记了读取此GPS模块输出的正确方法是一次读取一个字符,直到您在行末尾击中newline终结者,然后与它/将其记录到控制台。
所以我的代码变成了:
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;
}
}
现在完美工作:)
- scanf() 只取数字作为输入,避免使用其他字符
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 我正在尝试为字符打印一些相应的值,但条件总是转到其他位置
- 如何将特定字符视为其他值?
- 将十六进制字符数组存储在字节数组中,而无需更改为 ASCII 或其他任何东西
- 将一个字符替换为字符串中更多数量的字符,而不删除C++中的其他字母
- C++,字符串声明中的其他字符
- isdigit() 和 isalnum() 给出错误,因为输入是一个常量字符并且无法转换。其他可能查看输入是否为数字的方法?
- 如何使用Xcode中的Unicode打印字符╔(和其他字符)
- C 日食控制台编码纯文本作为其他字符
- 如何将其他字符连接到C 中的字符串
- 我应该采取什么方法来将ascii字符转换为c++中的其他字符
- 如何检查输入是否是没有任何其他字符的有效整数
- 与其他字符相比,c++/Arduino 处理“?”的方式是否不同
- 将亚洲字符和其他字符放入Visual Studio源代码中
- 清除输入缓冲区中的所有其他字符
- 需要读取空白和其他字符C++
- 在C++中的其他字符之间添加字符
- 只使用指针打印数组中的其他字符
- 如何通过添加空格或其他字符来读取用户输入