C++;从串行端口输出可读的十六进制代码
我这里有一点C代码,可以读取串行设备的输出。。我目前正在使用perl从设备读取数据,这很正常,但我更愿意用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
#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]);
}