Артема Гибридная связь с с ++ на Linux - PullRequest
1 голос
/ 30 октября 2011

В настоящее время я пытаюсь интегрировать систему POS с контроллером Artema Hybrid CC. Мне интересно, работал ли кто-то еще над этим или чем-то подобным.

Я могу читать с устройства, то есть я получаю ENQ и отправляю обратно ACK в потоке, и я держу его открытым для чтения / записи, но все, что я пытаюсь записать с него, просто ничего не делает.

Вот код для функции записи данных:

void PayLife::sendPayLifeData(QString data) {

  int len = data.length();
  int i = 0;
  char lrc = 0;
  char stx = 0x02;
  char etx = 0x03;
  char ack = 0x06;
  char * bytes;
  int ret;
  char buffer[132];

  bytes = (char *) malloc(sizeof(char) * len + 10);
  strcpy(bytes,data.toLatin1().data());
  qDebug() << "PayLife Sending data: " << data << " of len " << QString::number(len) <<
          " " << " Bytes is: " << bytes ;
  while (i < len) {
    lrc ^= bytes[i];
    i++;
  }
  /* sprintf(buffer,"%c%c%s%c%c",ack,stx,bytes,etx,lrc);
  for (i = 0; i < strlen(buffer); i++) {
    printf("c: %X ", buffer[i]);
  }
  printf(" [[ %s ]] \n", buffer); */
  qDebug() << "Starting";
  write(this->descriptor,&ack,1);
  usleep(100000);
  write(this->descriptor,&stx,1);
  usleep(100000);
  ret = write(this->descriptor,bytes,132);
  usleep(100000);
  write(this->descriptor,&etx,1);
  usleep(100000);
  write(this->descriptor,&lrc,1);
  qDebug() << "Done";
  free(bytes);
}

Аргумент данных: E11U000008507000099VZ000000

Конечно, документация на немецком языке, на которой я не говорю, так что это насколько я получил. У меня в основном есть 1 месяц, чтобы реализовать это, затем я должен вернуть устройство.

Если у кого-то есть какие-нибудь указатели или какой-нибудь пример кода, который был бы замечательным.

/ * Ясон 1014 *

1 Ответ

1 голос
/ 31 октября 2011

Транспортный протокол выглядит как что-то стандартное, поэтому, возможно, вам следует отправлять только len байтов данных, а не 132, и включать символ ETX в суммирование lrc?

Возможно, будет проще и понятнее использовать QByteArray вместо malloc массивов или QString (QString для отображаемых пользователем строк, что здесь не так):

void PayLife::sendPayLifeData(const QByteArray & data) {
    static const char stx = 0x02;
    static const char etx = 0x03;
    static const char ack = 0x06;

    QByteArray buffer = stx + data + etx;
    // Calculate the xor sum on data + etx
    char lrc = 0;
    for(int i = 1; i < buffer.size(); ++i) {
       lrc ^= buffer[i];
    }
    buffer += lrc;

    qDebug() << "Starting";
    write(this->descriptor, &ack, 1);
    write(this->descriptor, buffer.data(), buffer.size()); 
    qDebug() << "Done";       
}

Вы также должны взглянуть на QSerialDevice, это может позволить вам реализовать протокол более управляемым событиями способом с сигналом и слотами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...