Correct format for writing data to Datalogic PM9500 Scanner in c++ libusb -


i'm working **pm9500 scanner (4-key model)**from datalogic , trying send message screen after event triggers. i've been looking on correct way format messages, have tried far has been failure. according datalogic documentation, message sent handheld device should this:

[scanner_addr] [scanner_addr_delimiter] dc2 message cr

apparently there way send scanners connected same base 00 00 00 00 2a aa multicast message, adding prefix doesn't seem work.

(the scanner set using usb-com mode) since don't have delimiter activated on device, that's not necessary send. figured out dc2 = 0x12 , cr = 0x0d, stumped on how actually lay out format of message.

this how have formatted right now:

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

then send using libusb bulk transfer :

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

the write base station successful , writes whole message, won't show on screen no matter formatting try do. have experience coding these scanners?

edit : whole code example in 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:  }; 

in deviceusb.cpp

#include "deviceusb.h" #include <iostream> #include <cstring>  using namespace std;  int main() {      libusb_device ** devs; //pointer pointer of device, used retrieve 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 library session declared     if(r < 0) {         cout << "init error " << r << endl; //there error         return 1;     }     libusb_set_debug(context, libusb_log_level_debug); //set verbosity level 3, suggested in documentation      cnt = libusb_get_device_list(context, &devs); //get list of devices     if(cnt < 0) {         cout << "get device error" << endl; //there error         return 1;     }     cout << cnt << " devices in list." << endl;     libusb_device * device;     (size_t = 0; < 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 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 list, unref devices in      string msg = "0000000c86b40x12hi0x0d";     int size = msg.size();     cout << "size : " << size << endl;     unsigned char *data = new unsigned char[size]; //data write     strncpy((char*)data, msg.c_str(), size);      int retbytes;     if(libusb_kernel_driver_active(devicehandle, 0) == 1) { //find out if kernel driver attached         cout << "kernel driver active" << endl;         if(libusb_detach_kernel_driver(devicehandle, 0) == 0) //detach             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 see data want write      r = libusb_bulk_transfer(devicehandle, (2 | libusb_endpoint_out), data, size, &retbytes, 0); //my device's out endpoint 2, found trial- device had 2 endpoints: 2 , 129      if(r == 0 && retbytes == size) //we wrote 4 bytes         cout << "writing successful!" << endl;     else         cout << "write error" << endl;      r = libusb_release_interface(devicehandle, 0); //release claimed interface     if(r!=0) {         cout << "cannot release interface" << endl;         return 1;     }      libusb_close(devicehandle); //close device opened     libusb_exit(context); //needs called end      delete[] data; //delete allocated memory data     return 0; } 

i fixed it! correct formatting of message needs :

 string msg = "0000000c86b4\x12\x1b[2jhi\x0d"; 

the \x1b[2j clearing whole display , moving cursor correct position.


Comments

Popular posts from this blog

PHP and MySQL WP -

android - InAppBilling registering BroadcastReceiver in AndroidManifest -

go - golang pprof for c library code -