2017-08-15 8 views
0

Je travaille actuellement avec le scanner ** PM9500 (modèle à 4 touches) ** de Datalogic et j'essaie d'envoyer un message à l'écran après le déclenchement d'un certain événement. . J'ai cherché un moyen correct de formater les messages, mais tout ce que j'ai essayé jusqu'ici a été un échec. Selon la documentation Datalogic, un message envoyé à l'appareil de poche devrait ressembler à ceci:Format correct pour écrire des données sur le scanner Datalogic PM9500 en C++ libusb

[Scanner_Addr] [Scanner_Addr_delimiter] DC2 MESSAGE CR

Apparemment, il y a aussi un moyen d'envoyer à tous scanners connectés à la même base avec un message multidiffusion 00 00 00 00 2A AA, mais en ajoutant que comme un préfixe ne semble pas non plus fonctionner. (Le scanner est réglé sur le mode USB-COM) Étant donné que je n'ai pas de délimiteur activé sur l'appareil, il n'est pas nécessaire d'envoyer. J'ai compris que DC2 = 0x12 et CR = 0x0D, mais je suis perplexe sur la façon de effectivement mettre en forme le format du message.

Voici comment je l'ai formaté en ce moment:

string msg = "0000000C86B40x12HI0x0D"; // scanner address is specific to a scanner (12 char), this is a random scanner address for security 
int size = msg.size(); 
cout << "size : " << size << endl; 
unsigned char *data = new unsigned char[size]; //data to write 
strncpy((char*)data, msg.c_str(), size); 

puis-je l'envoyer à l'aide libusb avec un transfert en vrac:

r = libusb_bulk_transfer(dev_handle, (2 | LIBUSB_ENDPOINT_OUT), data, size, &actual, 0); 

L'écriture à la station de base est réussie et il écrit tout le message, mais il n'apparaîtra pas sur l'écran, quel que soit le formatage que j'essaie de faire. Quelqu'un at-il une expérience avec le codage de ces scanners?

EDIT: exemple de code entier dans DeviceUSB.h

#include <libusb-1.0/libusb.h> 
#include <cassert> 
#include <cstdio> 

#define SCANNER_VENDOR_ID 0x05f9 
#define SCANNER_PRODUCT_ID 0x2210 

class DeviceUSB 
{ 

    private: 
}; 

dans DeviceUSB.cpp

#include "DeviceUSB.h" 
#include <iostream> 
#include <cstring> 

using namespace std; 

int main() { 

    libusb_device ** devs; //pointer to pointer of device, used to retrieve a list of devices 
    libusb_device_handle * deviceHandle; //a device handle 
    libusb_context * context = NULL; //a libusb session 
    libusb_device_descriptor desc = {0}; 
    int r; //for return values 
    ssize_t cnt; //holding number of devices in list 
    r = libusb_init(&context); //initialize the library for the session we just declared 
    if(r < 0) { 
     cout << "Init Error " << r << endl; //there was an error 
     return 1; 
    } 
    libusb_set_debug(context, LIBUSB_LOG_LEVEL_DEBUG); //set verbosity level to 3, as suggested in the documentation 

    cnt = libusb_get_device_list(context, &devs); //get the list of devices 
    if(cnt < 0) { 
     cout << "Get Device Error" << endl; //there was an error 
     return 1; 
    } 
    cout << cnt << " Devices in list." << endl; 
    libusb_device * device; 
    for (size_t i = 0; i < cnt - 1; i++) 
    { 
     device = devs[i]; 
     int recieve = libusb_get_device_descriptor(device, &desc); 
     assert(recieve == 0); 
     printf("Vendor:Device = %04x:%04x\n", desc.idVendor, desc.idProduct); 

     if (desc.idVendor == SCANNER_VENDOR_ID) 
     { 
      break; 
     } 
     else 
      continue; 
    } 

    // open the device 
    int ret = libusb_open(device, &deviceHandle); 
    assert(ret == 0); 

    if(deviceHandle == NULL) 
     cout << "Cannot open device" << endl; 
    else 
     cout << "Device Opened" << endl; 
    libusb_free_device_list(devs, 1); //free the list, unref the devices in it 

    string msg = "0000000C86B40x12HI0x0D"; 
    int size = msg.size(); 
    cout << "size : " << size << endl; 
    unsigned char *data = new unsigned char[size]; //data to write 
    strncpy((char*)data, msg.c_str(), size); 

    int retBytes; 
    if(libusb_kernel_driver_active(deviceHandle, 0) == 1) { //find out if kernel driver is attached 
     cout << "Kernel Driver Active" << endl; 
     if(libusb_detach_kernel_driver(deviceHandle, 0) == 0) //detach it 
      cout << "Kernel Driver Detached!" << endl; 
    } 
    r = libusb_claim_interface(deviceHandle, 0); //claim interface 0 (the first) of device (mine had jsut 1) 
    if(r < 0) { 
     cout << "Cannot Claim Interface" << endl; 
     return 1; 
    } 

    cout << "Data->" << data << "<-" << endl; //just to see the data we want to write 
    r = libusb_bulk_transfer(deviceHandle, (2 | LIBUSB_ENDPOINT_OUT), data, size, &retBytes, 0); //my device's out endpoint was 2, found with trial- the device had 2 endpoints: 2 and 129 

    if(r == 0 && retBytes == size) //we wrote the 4 bytes successfully 
     cout << "Writing Successful!" << endl; 
    else 
     cout << "Write Error" << endl; 

    r = libusb_release_interface(deviceHandle, 0); //release the claimed interface 
    if(r!=0) { 
     cout << "Cannot Release Interface" << endl; 
     return 1; 
    } 

    libusb_close(deviceHandle); //close the device we opened 
    libusb_exit(context); //needs to be called to end the 

    delete[] data; //delete the allocated memory for data 
    return 0; 
} 
+0

Essayez d'utiliser '\ f' au lieu de' 0x12' et '\ r' à la place de' 0x0d' et en omettant tous les espaces. –

+0

Est-ce que 'string msg =" \ fHI \ r ";' n'obtenant toujours aucune entrée à l'écran. J'ai essayé de contacter leurs techniciens aussi en vain. –

+0

Quel était votre code EXACT, y compris l'adresse du scanner? Veuillez cliquer sur "modifier" sous votre question et mettez-le à jour (pas dans la zone Commentaires). –

Répondre

1

Je l'ai fixé! La mise en forme correcte du message doit être:

string msg = "0000000C86B4\x12\x1b[2JHI\x0d"; 

le \ x1b [2J est pour effacer tout l'écran et en déplaçant le curseur sur la position correcte.

+0

Bien fait et merci de partager avec la communauté. –