C++;从串行端口输出可读的十六进制代码

C++;从串行端口输出可读的十六进制代码,c,serial-port,hex,C,Serial Port,Hex,我这里有一点C代码,可以读取串行设备的输出。。我目前正在使用perl从设备读取数据,这很正常,但我更愿意用C编写一些东西来完成同样的工作 这是我到目前为止得到的代码 #include<stdio.h> /* Standard input/output definitions */ #include<stdlib.h> #include<string.h> /* String function definitions */ #include<unis

我这里有一点C代码,可以读取串行设备的输出。。我目前正在使用perl从设备读取数据,这很正常,但我更愿意用C编写一些东西来完成同样的工作

这是我到目前为止得到的代码

#include<stdio.h>   /* Standard input/output definitions */
#include<stdlib.h>
#include<string.h>  /* String function definitions */
#include<unistd.h>  /* UNIX standard function definitions */
#include<fcntl.h>   /* File control definitions */
#include<errno.h>   /* Error number definitions */
#include<termios.h> /* POSIX terminal control definitions */
#include<string.h>
#include<unistd.h>

char *buf;
int fd; /* File descriptor for the port */
int i,n;

int open_port(void)
{
    fd = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NDELAY);

if (fd == -1)     {
    perror("cannot open");
}
else
    fcntl(fd, F_SETFL, 0);
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B38400);
cfsetospeed(&options, B38400);
options.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &options);
options.c_cflag &= ~CSIZE;
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
//    options.c_cflag |= (IXON | IXOFF | IXANY); // xon & xoff on
return (fd);
}

int main(int argc) {
    buf=malloc(4095);
    open_port();
    free(buf);
    while(1){
        read(fd,buf,128);
         printf("%s\n",buf);
    }
    close(fd);
}
假设您想要“统一”十六进制代码,必要时用零填充,并且您还想要打印所有数据(
%s”
格式说明符需要以NUL结尾的字符串,因此如果二进制数据中有零,这肯定不起作用):

read(fd,buf,128);
int i;
对于(i=0;i<128;i++){
printf(“%02x”,buf[i]);
}
您还需要将
buf
声明为
无符号字符*
并且您还应该始终检查
read()

的返回值。您可能希望使用“统一”十六进制代码,必要时用零填充,并且您还希望打印所有数据(
%s)”
格式说明符需要一个以NUL结尾的字符串,因此如果二进制数据中有零,这肯定不起作用):

read(fd,buf,128);
int i;
对于(i=0;i<128;i++){
printf(“%02x”,buf[i]);
}


您还需要将
buf
声明为
无符号字符*同时还应该检查<代码> >()的代码返回值< /p> >标题和标签,如C++,你说C.是C还是C++?必须说它看起来像C.printf(“%x\n”,buf);试过这个。。但是我得到的十六进制代码与我从perl得到的不同。。perl是正确的..从perl发送什么格式?字符,整数,无符号整数?你应该用同样的格式读。我的意思是,如果你发送一个字符,你应该读一个字符。在这种情况下,我会发送未签名的int和读取未签名的int。我添加了Perl代码。标题和标签说C++,你说C.是C还是C++?必须说它看起来像C.printf(“%x\n”,buf);试过这个。。但是我得到的十六进制代码与我从perl得到的不同。。perl是正确的..从perl发送什么格式?字符,整数,无符号整数?你应该用同样的格式读。我的意思是,如果你发送一个字符,你应该读一个字符。在本例中,我将发送无符号整数并读取无符号整数。我添加了perl代码。阅读问题中的注释,这是有人建议的,但不是问题。他说他尝试了,但没有得到相同的值,因此我认为他有一个从perl到c的转换问题。@fonZ:在c语言中没有定义任何值“从Perl到C的转换问题“。C代码有一个问题,它将有一个C解决方案,它与Perl完全没有任何关系。@AlexvanEs:是时候学习如何在规范中做到精确了。你是说你想一次打印4个字节,用十六进制表示法?因此,请阅读
printf
的文档,了解如何做到这一点。@LightnessRacesinOrbit和你在他们冒犯我时前来救援。谢谢阅读问题中的评论,这是建议,但不是问题。他说他尝试了,但没有得到相同的值,所以我认为他有一个从perl到c的转换问题。@fonZ:c语言中没有定义任何“从perl到c的转换问题”。C代码有一个问题,它将有一个C解决方案,它与Perl完全没有任何关系。@AlexvanEs:是时候学习如何在规范中做到精确了。你是说你想一次打印4个字节,用十六进制表示法?因此,请阅读
printf
的文档,了解如何做到这一点。@LightnessRacesinOrbit和你在他们冒犯我时前来救援。谢谢
while ($timeout>0) {
        my ($count,$saw)=$PortObj->read(1); # will read _up to_ 255 chars
        if ($count > 0) {
                $chars+=$count;
                $buffer.=$saw; my $hex = unpack 'H*', $saw; printf ($hex);
read(fd, buf, 128);
int i;
for (i = 0; i < 128; i++) {
    printf("%02x ", buf[i]);
}