2011-10-30 7 views
1

私は現在、Artema Hybrid CCハンドヘルドとPOSシステムを統合しようとしています。他の誰かがこれに似たようなことをしているのか、それとも似たようなことをしているのだろうか。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文字を含める必要がありますか?

malloc配列やQStringの代わりにQByteArrayを使用する方が簡単かつ明確であるかもしれない(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を見ている必要があり、信号とスロットを使用して、イベント駆動型の方法でプロトコルを実装することができます。

+0

これは多かれ少なかれ本質的に私が思い付いたものです。 ETXがLRCに参加している必要があることが判明したので、現在Linuxで作業していますが、Windowsで動作させるつもりはないので、このQSerialPortが答えになるかもしれません。ありがとう! –

関連する問題