Отправка шестнадцатеричных данных через последовательный порт в Linux

У меня есть задача отправить шестнадцатеричные данные на мой COMPORT в Linux. Я написал этот простой код на 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);
}

Пожалуйста помоги

Заранее спасибо :) :)


person Prashant Singh    schedule 02.07.2011    source источник
comment
Шестнадцатеричное значение - это строковое представление двоичного значения. Каждый символ строки представляет 4 бита (полубайт). Последовательные порты могут отправлять данные в единицах 5, 6, 7 или 8 бит. Итак, вы пытаетесь отправить строки или числа?   -  person dbasnett    schedule 02.07.2011


Ответы (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 этим данным в порт.

person Yann Ramin    schedule 02.07.2011
comment
Единственная проблема, с которой я остаюсь, заключается в том, что один раз после отправки шестнадцатеричного числа он немедленно закрывает порт. Мне нужно держать его открытым до тех пор, пока я не захочу, чтобы я мог отправить столько байтов, сколько захочу за один раз ... вот основная часть кода .... `while (check! = 0) {scanf (% x , buf); n = запись (fd, buf, n); если (* buf == 0) {проверка = 0; }} `check изначально равен 1. Но он не работает. Есть догадки, почему ?? - person Prashant Singh; 02.07.2011
comment
Я думаю, мне нужно добавлять данные в файл, а не записывать его снова и снова. Можете ли вы помочь мне с синтаксисом добавления данных в конец файла связи. - person Prashant Singh; 02.07.2011
comment
@Prashant: buf не должен изменяться при обращении к write. Что вы от него ждете? - person Yann Ramin; 04.07.2011

С кодом есть несколько проблем:

  • Текст, считанный с консоли, интерпретируется как десятичный ("%d"); если вы хотите интерпретировать его как шестнадцатеричный, используйте "%x".
  • write() является патологическим. Третий аргумент - это количество байтов для записи, а не значение. Это должно быть либо

    n = write (fd, "ATZ\r", 4); // there are 4 bytes to write to init the modem

or

char  buf[10];
n = sprintf (buf, "%x", number);   // convert to hex
n = write (fd, buf, n);            // send hex number out port
person wallyk    schedule 02.07.2011

Эта функция принимает шестнадцатеричную строку и преобразует ее в двоичную форму, которую вы действительно хотите отправить. шестнадцатеричное представление предназначено для того, чтобы люди могли понять, что отправляется, но независимо от устройства, с которым вы общаетесь, вероятно, потребуются фактические двоичные значения.

// 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;
}
person Skaag Argonius    schedule 17.05.2013