2011-10-30 35 views
1

我目前正試圖將POS系統與Artema混合CC手持設備集成。我想知道是否有其他人已經在這個或類似的工作。Artema與Linux上的C++混合通信

我可以從設備讀取數據,也就是我收到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個月來實現這一點,然後我必須讓設備回來。

如果任何人有任何指針,或一些示例代碼將是非常棒的。

/傑森

回答

1

傳輸協議看起來像是標準,所以也許你應該只發送len字節的數據沒有132和包括在lrc求和的ETX字​​符?

可能更容易和更清晰的使用QByteArray代替malloc陣列或QStringQString是用戶顯示的串是不是這裏的情況):

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看看,它可以允許您以信號和插槽以更多事件驅動的方式實現協議。

+0

這或多或少都是我想到的。是的,因爲它證明了ETX必須在LRC中,所以我很高興地說它目前在Linux中工作,但我不想讓它在Windows上工作,所以這個QSerialPort可能是答案,所以謝謝! –