CH375b USB Disk Module Host Serial Read Write Data Bus Arduino

hello everyone,

I came across the CH375* USB Disk Module Host Serial Read Write Data Bus for Arduino. Besides the chip datasheet that is floating around the internet, is there any other type of tutorials about connections and or basic programming tips on this arduino usb module? There is hardly no info or sample that we can try with this module.

i know this going to be a weird question to some of you, but i need to ask.

Can i connect a bar code scanner to this?

if there is can anyone point the way to such valueabl information

I know that the Ch376* has capabilities to connect a mouse.

Thanks in Advnace.

Besides the chip datasheet that is floating around the internet, is there any other type of tutorials about connections and or basic programming tips on this arduino usb module?

Besides what ? What do we have to compare what we have with what you found ?

Why don't you post what you have first ?

Can i connect a bar code scanner to this?

What are you going to do for a USB driver for the scanner. It comes with a windows or Mac driver you can download from the web but that's not going to run on your arduino. Are you going to write your own bar code scanner USB driver ? (answer: I think not)

I would start with googling "ch375 arduino" - seems there's tons of information and multiple libraries available and tutorials available.

If the bar code scanner acts like a keyboard, it is likely to be comparatively easy to make use of, since someone has probably already written code to interface with USB HID devices (mice, keyboards, joysticks) using the CH375. If it doesn't act like one of those, and you have to install drivers to make it work on a computer, it is likely to be a nightmare to interface with, as you would need to write the driver. The information about the device you're interfacing with is unlikely to be publicly available, and the manufacturer will stone-wall requests for said information, saying that they only support certain host operating systems and referring you to their supported platform list.

In general, you should try to avoid having to make an Arduino act as a USB host - it's a tar-pit of difficulty. Can you find a bar-code scanner with a serial (TTL or RS232 - the former requiring no extra hardware, and the latter a simple MAX232 or similar to shift the voltage levels) interface instead? That would be really easy to interface with.

maybe you should use this:

CH-375 arduino library Github

and check here

Thanks guys,

Raschemmel, I totaly agree with you, but litteraly there isnt much information on this device. I am trying to use a scanner becuase its going to be a stand alone device and it will just reads the bar codes with the scanner put it on RTF or XML file and save it.

if there are other alternatives please point me to the right direction.

i found an older forum here in with simliar issues. but i didnt see it ended well. which i think this will as well.

thank guys, i will keep on seraching and if i find something i will post it here asap.

onces again guys

Thank you for the help

@OP My point was that you posted for help and claimed there was documentation "floating around the net" but posted nothing (no links , nothing). If you found nothing say " I found nothing" but don't say "I found something " and not post it.

Here's what I found:

Vendor link

ch-340 docs (not sure how it relates)



As far as I can tell , the CH-340 is a USB to Serial chip and the CH-375 is a USB BUS Interface Chip. If you ask me , you are getting way over your head and nothing will come of this, but some people like that kind of challenge. It looks like a can of worms to me. I don't mind doing a lot of work if there is a clear plan. For my senior project I needed an ASCII serial keyboard to talk to my wire-wrapped 68000 uP with a graphics driver chip so I went to a surplus store and found a $1000+ custom metal keyboard from an ATE for $50. I bought it , took it home and took it apart and found out it was a parallel keyboard and the codes were all CUSTOM ,(not ASCII). Did I give up ? No, I sat down and wrote down every parallel code , (the binary) and the key associated with the code. Then I made a lookup table using the codes. I used the key codes to address a ROM , and then I stored the correct ASCII value in the address sent by the keyboard when that key was pressed, then I added a parallel to serial UART which converted the ascii codes to serial and walah ! presto ! One ASCII serial keyboard , and a beautiful all metal keyboard at that with about 6 different color keys. But in your case, I don't see a plan , and it looks like a train wreck waiting to happen...

HI, its been a while since i posted this and the fact was that i left this open was becuase after so much time i spent finding information or the proper tutorial on how to make this CH375/6 USB HOST to work. i kind of gave up on it. now i kind of came back to it and again i am finding almost nothing on this besides it being a flash storage deivce reader. which i dont really need cuase there are so many eaiser alternatives.

well the good news is that i found something better and functional to what i wanted this device in the first place. i am now using a USB HOST Shield with both my Arduino UNO and Mega 2560, and it works pretty good with the 2d scanner.

It took me some tinkering to get the USB HOST Shield to work as well but ther is alot more information on this then the CH375/6 USB HOST. My code for the USB HOST SHield is confusing but like everyone it took me alot of coping and pasting from diffrent codes to make it work as i wanted. if you can improve it please aadvice me, but for now it works okay for my use.

now i am trying to make it work with Processing 3.0 to have a graphic environment to my arduino sketch and more interactive as processing 3.0 can help ob this. but at the moment i am having issues on making that connection with processing reading my Scanner as Arduino does. any advice???

Thanks in advance.

#include <usbhid.h>
#include <usbhub.h>
#include <hiduniversal.h>
#include <hidboot.h>
#include <SPI.h>

class MyParser : public HIDReportParser {
    void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
    uint8_t KeyToAscii(bool upper, uint8_t mod, uint8_t key);
    virtual void OnKeyScanned(bool upper, uint8_t mod, uint8_t key);
    virtual void OnScanFinished();

MyParser::MyParser() {}

void MyParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
  // If error or empty, return
  if (buf[2] == 1 || buf[2] == 0) return;

  for (uint8_t i = 7; i >= 2; i--) {
    // If empty, skip
    if (buf[i] == 0) continue;

    // If enter signal emitted, scan finished
    if (buf[i] == UHS_HID_BOOT_KEY_ENTER) {

    // If not, continue normally
    else {
      // If bit position not in 2, it's uppercase words
      OnKeyScanned(i > 2, buf, buf[i]);


uint8_t MyParser::KeyToAscii(bool upper, uint8_t mod, uint8_t key) {
  // Letters
  if (VALUE_WITHIN(key, 0x04, 0x1d)) {
    if (upper) return (key - 4 + 'A');
    else return (key - 4 + 'a');

  // Numbers
  else if (VALUE_WITHIN(key, 0x1e, 0x27)) {
    return ((key == UHS_HID_BOOT_KEY_ZERO) ? '0' : key - 0x1e + '1');

  return 0;

void MyParser::OnKeyScanned(bool upper, uint8_t mod, uint8_t key) {
  uint8_t ascii = KeyToAscii(upper, mod, key);

void MyParser::OnScanFinished() {
  //Serial.println(" - Finished");

USB          Usb;
USBHub       Hub(&Usb);
HIDUniversal Hid(&Usb);
MyParser     Parser;

void setup() {
  Serial.begin( 115200 );

  if (Usb.Init() == -1) {
   // Serial.println("OSC did not start.");

  delay( 200 );

  Hid.SetReportParser(0, &Parser);

void loop() {