我目前正在尝试将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个月的时间来实施,然后必须退还设备。

如果任何人有任何指针,或一些很棒的示例代码。

/杰森

最佳答案

传输协议(protocol)看起来像某种标准协议(protocol),因此也许您应该只发送数据的len字节而不是132,并在lrc求和中包括ETX字符?

使用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,它可以让您以更多的事件驱动方式通过信号和插槽来实现协议(protocol)。

关于c++ - Linux上与C++的Artema Hybrid通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7947338/

10-11 22:46
查看更多