我正在读取数据从串口到安装了VxWorks的ueipac 600-1G linux盒子。我应该读取字符串数据。但是当我发送一个字符串时,为了测试我使用“这是一个测试”,我的日志文件显示“这是一个test¤-p”。我修改了我的代码以读取十六进制值并得到“74 68 69 73 20 69 73 20 61 20 74 65 73 74 0a”,当插入十六进制转换器时读取“这是一个测试”。
我使用不同的输入字符串进行了多次测试,每次都会发生乱码。我想知道如何过滤掉这种乱码我认为它与C如何将十六进制数据转换为字符串有关,并带有0a字符。
我的代码如下
void readandlog_serial(){
// read error throwing int
int n=0;
int bytes_counter=0;
int bytes=256; /*num of bytes to read at a time*/
int i=0; /* for the for loop*/
int bytes_written=0;
// hold the file descriptor
int fd=0;
/* dev name from iosDevShow output */
char dev_name[] = "/tyCo/0";
/* buffer to receive read */
char re[bytes];
/* length of string to read */
int re_len = bytes;
/* open the device for reading. */
fd = open( "/tyCo/0", O_RDWR, 0);
outputfile=fopen ("LOGFILE.txt","a"); /* open output file*/
//check for open error
if(fd<0)
fprintf("outputfile","%s","\nerror opening file\n");
//while(n = read( fd, re, re_len)>0)
//bytes_counter=bytes_counter+n;
n = read( fd, re, re_len); /* read */
if(n<0)
fprintf("outputfile","%s","\nerror reading file\n");
close( fd ); /* close */
for (i=0; i<n;++i){
bytes_written=bytes_written+( fprintf(outputfile," %02x", re[i]) );
}
//fprintf(outputfile,"%c",'\n');
// pull only string data
//bytes_written=fprintf(outputfile,"%s",re); *****************************
fclose(outputfile);
printf("readandlog executed number of bytes written: %d\n",bytes_written);
}
对于字符串读取构建,for循环被注释掉,并且旁边的astriks的fprintf行被注释掉,用于十六进制数据读取构建。
答案 0 :(得分:0)
十六进制输出正确,你的字符串+ 0A换行。
您使用未初始化的变量重新,打印HEX是正确的,因为您打印 n char的HEX值,但是 fprintf(outputfile,&#34;% s&#34;,re); 将打印以空字符结尾的字符串(您的字符串+ OA +垃圾+ \ 0)。
将 char re [bytes]; 更改为 char re [bytes] = {}; 或将函数bzero / memset set buffer更改为0。