Trying to get 'print' and 'println' to work ?

I have a Leonardo where:

  • A Pocket AVR Programmer is plugged into the ICSP port.
  • A CP210x UART Bridge is plugged into GPIO pins 0, 1, GND.
  • A Raspberry Pi 3 is plugger into a miniUSB port.

I'm trying to get print and println to work with no success. I've written a little piece of C code to poll /dev/ttyUSB0 and /dev/ttyAMA0 for data. Nothing.

I tried using the IDE's "Serial Monitor" listening on serial ports /dev/ttyUSB0 and /dev/ttyAMA0. Nothing.

Suggestions?

Suggestions?

Start by posting the test program running on the Leonardo

#include <HID.h>
#include <Keyboard.h>
#include "usb_hid_keys.h"

#if 0
/* Arduino Zero */
#define SERDEBUG  Serial1
#define USBEvent  Serial
#endif

#if 1
/* Trinket M0 or 32u4 */
//#define SERDEBUG  Serial
#define USBEvent  Serial1
#endif

#define SHIFT 0x80
const uint8_t _asciimap[128] =
{
  0x00,             // NUL
  0x00,             // SOH
  0x00,             // STX
  0x00,             // ETX
  0x00,             // EOT
  0x00,             // ENQ
  0x00,             // ACK  
  0x00,             // BEL
  0x2a,     // BS Backspace
  0x2b,     // TAB  Tab
  0x28,     // LF Enter
  0x00,             // VT 
  0x00,             // FF 
  0x00,             // CR 
  0x00,             // SO 
  0x00,             // SI 
  0x00,             // DEL
  0x00,             // DC1
  0x00,             // DC2
  0x00,             // DC3
  0x00,             // DC4
  0x00,             // NAK
  0x00,             // SYN
  0x00,             // ETB
  0x00,             // CAN
  0x00,             // EM 
  0x00,             // SUB
  0x00,             // ESC
  0x00,             // FS 
  0x00,             // GS 
  0x00,             // RS 
  0x00,             // US 

  0x2c,      //  ' '
  0x1e|SHIFT,    // !
  0x34|SHIFT,    // "
  0x20|SHIFT,    // #
  0x21|SHIFT,    // $
  0x22|SHIFT,    // %
  0x24|SHIFT,    // &
  0x34,          // '
  0x26|SHIFT,    // (
  0x27|SHIFT,    // )
  0x25|SHIFT,    // *
  0x2e|SHIFT,    // +
  0x36,          // ,
  0x2d,          // -
  0x37,          // .
  0x38,          // /
  0x27,          // 0
  0x1e,          // 1
  0x1f,          // 2
  0x20,          // 3
  0x21,          // 4
  0x22,          // 5
  0x23,          // 6
  0x24,          // 7
  0x25,          // 8
  0x26,          // 9
  0x33|SHIFT,      // :
  0x33,          // ;
  0x36|SHIFT,      // <
  0x2e,          // =
  0x37|SHIFT,      // >
  0x38|SHIFT,      // ?
  0x1f|SHIFT,      // @
  0x04|SHIFT,      // A
  0x05|SHIFT,      // B
  0x06|SHIFT,      // C
  0x07|SHIFT,      // D
  0x08|SHIFT,      // E
  0x09|SHIFT,      // F
  0x0a|SHIFT,      // G
  0x0b|SHIFT,      // H
  0x0c|SHIFT,      // I
  0x0d|SHIFT,      // J
  0x0e|SHIFT,      // K
  0x0f|SHIFT,      // L
  0x10|SHIFT,      // M
  0x11|SHIFT,      // N
  0x12|SHIFT,      // O
  0x13|SHIFT,      // P
  0x14|SHIFT,      // Q
  0x15|SHIFT,      // R
  0x16|SHIFT,      // S
  0x17|SHIFT,      // T
  0x18|SHIFT,      // U
  0x19|SHIFT,      // V
  0x1a|SHIFT,      // W
  0x1b|SHIFT,      // X
  0x1c|SHIFT,      // Y
  0x1d|SHIFT,      // Z
  0x2f,          // [
  0x31,          // bslash
  0x30,          // ]
  0x23|SHIFT,    // ^
  0x2d|SHIFT,    // _
  0x35,          // `
  0x04,          // a
  0x05,          // b
  0x06,          // c
  0x07,          // d
  0x08,          // e
  0x09,          // f
  0x0a,          // g
  0x0b,          // h
  0x0c,          // i
  0x0d,          // j
  0x0e,          // k
  0x0f,          // l
  0x10,          // m
  0x11,          // n
  0x12,          // o
  0x13,          // p
  0x14,          // q
  0x15,          // r
  0x16,          // s
  0x17,          // t
  0x18,          // u
  0x19,          // v
  0x1a,          // w
  0x1b,          // x
  0x1c,          // y
  0x1d,          // z
  0x2f|SHIFT,    // {
  0x31|SHIFT,    // |
  0x30|SHIFT,    // }
  0x35|SHIFT,    // ~
  0       // DEL
};

KeyReport rawdata;
char aLine[81];
uint8_t aLine_count = 0;

void setup()
{
  Serial1.begin(9600);

#ifdef SERDEBUG
  SERDEBUG.begin(9600);
#endif
  USBEvent.begin(9600);
  aLine_count = 0;
}


void sendReport(KeyReport* keys)
{
   HID().SendReport(2,keys,sizeof(KeyReport));
}

void releaseAll()
{
   memset(&rawdata, 0x0, sizeof(KeyReport));
   sendReport(&rawdata);
}

uint8_t first_time = 1;

void loop() {
  
   memset(&rawdata, 0x0, sizeof(KeyReport));

   rawdata.keys[0] = KEY_RIGHT; 
   sendReport(&rawdata);
   releaseAll();

   delay(3000);

   rawdata.keys[0] = KEY_RIGHT; 
   sendReport(&rawdata);
   releaseAll();
   delay(3000);

   rawdata.keys[0] = KEY_RIGHT; 
   sendReport(&rawdata);
   releaseAll();
   delay(3000);

   rawdata.keys[0] = KEY_DOWN; 
   sendReport(&rawdata);
   releaseAll();
   delay(1000);

   rawdata.keys[0] = KEY_ENTER; 
   sendReport(&rawdata);
   releaseAll();

   if (first_time) {
    
     first_time = 0;
    
     memset(&rawdata, 0x0, sizeof(KeyReport));

     rawdata.keys[0] = KEY_CAPSLOCK;
     sendReport(&rawdata);
     releaseAll();
     delay(100);

     rawdata.keys[0] = KEY_CAPSLOCK;
     sendReport(&rawdata);
     releaseAll();
     delay(100);

     rawdata.keys[0] = KEY_LEFTSHIFT;
     sendReport(&rawdata);
     releaseAll();
     delay(100);
   }

   Serial.print("KEY_A: ");
   Serial.print(KEY_A);

   uint8_t c;
   if (Serial1.available())     // If anything comes in Serial1 (pins 0 & 1)
      c = Serial1.read();   // read it and send it out Serial (USB)

   memset(&rawdata, 0x0, sizeof(KeyReport));
     
   rawdata.keys[0] = _asciimap[c]; //KEY_A; 
   sendReport(&rawdata);
   releaseAll();
   
   rawdata.keys[0] = KEY_B; 
   sendReport(&rawdata);
   releaseAll();

   rawdata.keys[0] = KEY_W; 
   sendReport(&rawdata);
   releaseAll();

   rawdata.keys[0] = KEY_ENTER;
   sendReport(&rawdata);
   releaseAll();
   
   delay(1000);
}

When you are having problems, you need to eliminate all unnecessary complexity. That code has a ton of stuff that is completely unrelated to your current project of getting serial communication working.

Use this code:

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("hello");
  delay(1000);
}

After uploading it, open Serial Monitor. Make sure the baud rate menu at the bottom right corner of Serial Monitor is set to 9600. Does it work as expected?

Created a sketch with this code, built it, uploaded it, and set the port to /dev/ttyUSB0. Opened "Serial Monitor" (baud 9600) and got nothing.

Ran my C polling code on /dev/ttyUSB0; got nothing.

If I plug in the OTG cable and load the simple print sketch code, then I get /dev/ttyACM0 for a serial device I can monitor. And yes, the prints appear.

BUT if I'm running my USB keyboard emulation code then there is NO /dev/ttyACM0 and consequently nothing to monitor.

I tried:

void loop() {
  Serial1.println("hello");
  delay(1000);
}

And monitoring /dev/ttyUSB0. That's a no-go.

OK, that's a good start. Now try this:

void setup() {
  Serial1.begin(9600);
}

void loop() {
  Serial1.println("hello");
  delay(1000);
}

Make sure to select the port of your CP210x UART Bridge from the Arduino IDE's Tools > Port menu before opening the Serial Monitor.

Looking good guys!

Thanks for all your help!

You're welcome. I'm glad if I was able to be of assistance. Enjoy!
Per