串口读取VxWorks字符串转换乱码

时间:2016-08-08 16:59:28

标签: c string char serial-port vxworks

我正在读取数据从串口到安装了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行被注释掉,用于十六进制数据读取构建。

1 个答案:

答案 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。