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
Post a Comment