RS232 Industruino only sending over Serial1 (or any other?) not receiving
Hi,
Help is appreciated with a problem that can be summarised as "I can only send over serial but not received anything".
The RS232 setting :
- an IND.I/0 D21G (serial number AR0003587)
- via Serial1 by using (D10/D5 & ISO2 GND) and a TTL-to-USB cable connected to my workstation
- powered via USB by same workstation.
- using Serial1 in the program for communication
- no other connections are made on the Industruino.
- a basic program uploaded (see infra) that
- echo's over serial what is read over that same serial connection
- in addition for each 10 bytes received and each 500.000th iteration, it will send a message through serial + print it on the LCD screen.
- to observe what is send over that serial port I use on a linux workstation in a terminal window
cat /dev/ttyACM0
- to sent something, I launch in another terminal window
echo "Hello" > /dev/ttyACM0
Observations :
- all messages from Industruino to the workstation are seen on screen
- no messages sent to the Arduino are echoed,
- is confirmed by the 'bytes received counter' which is not increased
- I assume they never arrive? but why? Did rechecked I did not by accident misplaced D10 RX.
Alternatives tried :
- I used a regular Arduino Mega to verify if there was not error somehow made in the setup
- this functions as expected the "Hello" text is echoed in the terminal, like the other messages too
- Instead of Serial1, I tried to communicate via SerialUSB
- it receives nothing what I sent
- but the behaviour is not the same. When I start to monitor it with 'cat /dev/ttyACM0' on the LCD and what is echoed shows it is receive a lot
- what is echoed of what seems to be received are 'related fragments' of what is sent.
- Is this maybe related to the cause of my problem?
Any help is welcome as I am out of ideas how to proceed?
Kind regards
Mario
------ the program itself --------------
#include "Arduino.h"
#include <stdlib.h>
#include <limits.h>
#define ARDUINO_BAUD_RATE 9600
#define SERIALOBJ Serial1
#define INDUSTRUINO
#ifdef INDUSTRUINO
#include <Arduino.h>
#include <Indio.h>
#include <Wire.h>
#include <U8g2lib.h>
static U8G2_UC1701_MINI12864_F_2ND_4W_HW_SPI u8g2(U8G2_R2, /* cs=*/ 19, /* dc=*/ 22);
#define LCD_PIXELS_WIDTH 128
#define LCD_PIXELS_HEIGHT 64
#define CHARACTER_WIDTH 4
#define CHARACTER_HEIGHT 6
U8G2LOG lcdlog;
#define U8LOG_WIDTH LCD_PIXELS_WIDTH/CHARACTER_WIDTH
#define U8LOG_HEIGHT LCD_PIXELS_HEIGHT/CHARACTER_HEIGHT
uint8_t u8log_buffer[U8LOG_WIDTH*U8LOG_HEIGHT];
const int backlightPin = 26; // PWM output pin that the LED backlight is attached to
int backlightIntensity = 4; // LCD backlight intesity
#endif
unsigned long int counter = 0;
unsigned long int nm_rvcd = 0;
void setup() {
#ifdef INDUSTRUINO
pinMode(backlightPin, OUTPUT); //set backlight pin to output
analogWrite(backlightPin, (map(backlightIntensity, 5, 1, 255, 0))); //convert backlight intesity from a value of 0-5 to a value of 0-255 for PWM.
u8g2.begin();
// set the font for the terminal window
// small
u8g2.setFont(u8g2_font_tom_thumb_4x6_mf);
// large
// u8g2.setFont(u8g2_font_amstrad_cpc_extended_8f);
lcdlog.begin(u8g2, U8LOG_WIDTH, U8LOG_HEIGHT, u8log_buffer); // connect to u8g2, assign buffer
lcdlog.setLineHeightOffset(0); // set extra space between lines in pixel, this can be negative
lcdlog.setRedrawMode(0); // 0: Update screen with newline, 1: Update screen for every char
#endif
SERIALOBJ.begin(ARDUINO_BAUD_RATE);
}
void loop() {
if (SERIALOBJ.available()) {
nm_rvcd++;
// pure echo
SERIALOBJ.write(SERIALOBJ.read());
}
if (((nm_rvcd % 10)==0) && (nm_rvcd>0)) {
SERIALOBJ.print("Total received : ");
SERIALOBJ.println(nm_rvcd, DEC);
#ifdef INDUSTRUINO
lcdlog.print("Total received : ");
lcdlog.print(nm_rvcd);
lcdlog.print("\n");
#endif
}
counter++;
if ((counter % 500000)==0) {
SERIALOBJ.print("Counter : ");
SERIALOBJ.println(counter, DEC);
#ifdef INDUSTRUINO
lcdlog.print("Counter : ");
lcdlog.print(counter);
lcdlog.print("\n");
#endif
}
}
----- SerialUSB apparently receiving rubrish that resembles what it has sent -------
[mario@workstation]$ cat /dev/ttyACM0
Counter : 6500000
Counter Total received : 1040
: 6500000
Total received : 1050
Couner T1Total received : 1060
0465000010Total received : 1070
5Cone T104Total received : 1080
6500010T
Total received : 1090
one T104Total received : 1100
To00010T
Total received : 1110
Hi Tom,
The helpline functioned very well. You've put me back on rails. Thanks a lot.
Solution for me : just connecting the INDIO to an external power source. I was not aware this was mandatory in case the analog & digital zone was not used (of course just for testing some basic things ;-)
Here some more notes related to the other items on the checklist :
- TTL-USB does accept 3.3V. My lack of in dept knowledge made no distinction between the UART and RS232. A topic I can delve in deeper later if needed. Thanks to point that out.
- regarding the monitoring of the serial port I did not mentioned I do set the baudrate upfront with the following command
- stty 9600 -F /dev/ttyACM0 raw -echo
- so thats functioning fine
- in my case the microUSB connection from arduino maps to /dev/ttyACM0, the serial1 which I connect via ttl-to-USB maps to /dev/ttyUSB0. See
- mario@arenin]$ ls -l /dev/serial/by-id/usb-ES_Gear_Ltd._Industruino_D21G-if00
- lrwxrwx--- 1 mario mario 13 Dec 10 09:13 /dev/serial/by-id/usb-ES_Gear_Ltd._Industruino_D21G-if00 -> ../../ttyACM0
Kind regards
Mario
Hi, i will list a few things for you to check:
- to use the INDIO, you need to provide external power, i.e. 12-24V on the V+/V- terminals. power from USB only gives unpredictable results.
- you are using the Serial UART on D10/D5, this is not RS232. it has a TTL signal of 3.3V so your TTL-USB converter should also allow 3.3V voltage levels.
- to monitor a Serial port on Linux, it is better to use the 'screen' command so you can specify the baud rate, e.g. screen /dev/ttyACM0 9600 - however, it's much easier to use the Arduino IDE's Serial Monitor: select the port, open the window, and select the baud rate at the bottom. you see what it receives, and you can write in the top bar.
- i'm a bit confused with your statements, in my experience /dev/ttyACM0 is what you get when you connect the microUSB cable to the Industruino, for programming, and you can read/write to this with 'SerialUSB'. a TTL-USB cable will usually show up as /dev/ttyUSB0. you can also connect to this port in the Arduino IDE's Serial Monitor.
Let us know if any of this fixes your issue.
Your answer
Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!
Keep Informed
About This Forum
This community is for professionals and enthusiasts of our products and services.
Read GuidelinesQuestion tools
Stats
| Asked: 12/9/21, 9:29 PM |
| Seen: 2135 times |
| Last updated: 12/10/21, 8:30 AM |