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

时间:2013-02-17 13:20:18

标签: c serial-port hex

我在这里得到了一些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);
}

当我编译并运行它输出数据时,但我看到的数据是垃圾格式...我想看到的是可读的十六进制数据,如0AEA4E2A ...任何人都知道如何轻松转换数据可读的十六进制代码?我一直在谷歌搜索一段时间,但似乎没有什么真正的工作。

这就是我在perl中所做的;

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);

1 个答案:

答案 0 :(得分:3)

据推测,您需要“统一”十六进制代码,必要时填充零,并且您还要打印所有数据("%s"格式说明符需要以NUL结尾的字符串,所以如果你的二进制数据中有零,那肯定不会有效:)

read(fd, buf, 128);
int i;
for (i = 0; i < 128; i++) {
    printf("%02x ", buf[i]);
}

您还需要将buf声明为unsigned char *;,并且还应始终检查read()的返回值。