我有一个将十六进制数据发送到linux中的COMPORT的任务。我写了这个简单的C代码,但它只发送一个十进制数。任何人都可以帮我发送一个十六进制位。
这是我写的代码
#include <stdio.h> /* Standard input/output definitions */
#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 */
int number,n;
void main(void){
open_port();
}
int open_port(void)
{
int fd; /* File descriptor for the port */
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
perror("open_port: Unable to open /dev/ttyACM0 - ");
}
else{
printf("Port Opened successfully\n");
number = 1;
while(number!=55){
scanf("%d",&number);
n = write(fd, "ATZ\r", number);
if (n < 0)
fputs("write() of 4 bytes failed!\n", stderr);
}
}
return (fd);
}
请帮忙
提前致谢:):)
答案 0 :(得分:3)
write
定义为:
ssize_t write(int fd, const void *buf, size_t count);
也就是说,它会从count
向fd
发送buf
个字节。在您的情况下,数据始终是字符串“AZTR \ r”,加上之后的未定义数据(如果计数> 5)。您的程序既不发送十六进制也不发送十进制数据。
是否要发送二进制数据或一串十六进制字符?
对于选项一,您可以使用:write(fd, somebuffer, len);
,其中一些缓冲区是指向任何字节集(包括整数等)的指针。
对于选项二,首先使用sprintf
将数据转换为十六进制字符串,并将%02X
作为格式字符串,然后将write
数据转发到端口。
答案 1 :(得分:2)
代码有几个问题:
"%d"
);如果您希望将其解释为十六进制,请使用"%x"
。write()
是病态的。第三个参数是要写入的字节数,而不是值。它应该是
n = write (fd, "ATZ\r", 4); // there are 4 bytes to write to init the modem
或
char buf[10];
n = sprintf (buf, "%x", number); // convert to hex
n = write (fd, buf, n); // send hex number out port
答案 2 :(得分:0)
此函数将采用十六进制字符串,并将其转换为二进制,这是您要实际发送的内容。十六进制表示是为了让人类能够理解正在发送的内容,但无论您与之通信的设备是什么,都可能需要实际的二进制值。
// Converts a hex representation to binary using strtol()
unsigned char *unhex(char *src) {
unsigned char *out = malloc(strlen(src)/2);
char buf[3] = {0};
unsigned char *dst = out;
while (*src) {
buf[0] = src[0];
buf[1] = src[1];
*dst = strtol(buf, 0, 16);
dst++; src += 2;
}
return out;
}