串口读取VxWorks字符串转换乱码
Serial Port Reading VxWorks String conversion gibberish
我正在从串行端口读取数据到安装了 VxWorks 的 ueipac 600-1G linux 盒子。我应该读入字符串数据。然而,当我发送一个字符串时,为了测试我使用了 "this is a test" 我的日志文件显示为 "this is a test¤ -p"。我更改了我的代码以读取十六进制值并得到“74 68 69 73 20 69 73 20 61 20 74 65 73 74 0a”,当插入十六进制转换器时读取 "this is a test".
我用不同的输入字符串进行了多次测试,每次都会出现乱码。我想知道如何过滤掉这些乱码,我认为这与 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 循环,为十六进制数据读取构建注释掉旁边带有星号的 fprintf 行。
十六进制输出正确,您的字符串 + 0A 换行符。
您使用未初始化的变量 re,打印 HEX 是正确的,因为您为 n 字符打印 HEX 值,但是 fprintf(outputfile,"%s",re); 将打印空终止字符串(您的字符串 + OA + 垃圾 + \0)。
将 char re[bytes]; 更改为 char re[bytes] = {}; 或使用函数 bzero/memset将缓冲区设置为 0.
我正在从串行端口读取数据到安装了 VxWorks 的 ueipac 600-1G linux 盒子。我应该读入字符串数据。然而,当我发送一个字符串时,为了测试我使用了 "this is a test" 我的日志文件显示为 "this is a test¤ -p"。我更改了我的代码以读取十六进制值并得到“74 68 69 73 20 69 73 20 61 20 74 65 73 74 0a”,当插入十六进制转换器时读取 "this is a test".
我用不同的输入字符串进行了多次测试,每次都会出现乱码。我想知道如何过滤掉这些乱码,我认为这与 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 循环,为十六进制数据读取构建注释掉旁边带有星号的 fprintf 行。
十六进制输出正确,您的字符串 + 0A 换行符。
您使用未初始化的变量 re,打印 HEX 是正确的,因为您为 n 字符打印 HEX 值,但是 fprintf(outputfile,"%s",re); 将打印空终止字符串(您的字符串 + OA + 垃圾 + \0)。
将 char re[bytes]; 更改为 char re[bytes] = {}; 或使用函数 bzero/memset将缓冲区设置为 0.