我目前正在尝试将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/