Lightsout
Lightsout

Reputation: 3767

Python serial write doesn't work FIRST run

I have 2 programs to test serial communication, an simple arduino program that echoes whatever is on the serial port and a python program that writes to the serial port and prints the reply.

I'm having an issue where whenever I upload the arduino program and try to run the python the first time after I uploaded, it would be stuck on print ser.readline() which I'm assuming means for some reason python is not writing to the serial port. I would have to quit the python program and run it again to get it to get a reply from arduino. The program would continue to work until I re-upload the arduino then once again python wouldn't work on first run. Also if I open and close the serial monitor before I run the python program it will work the first run. Does anyone know what is the issue? This is on Ubuntu.

arduino

String str;

void setup() {                
// Turn the Serial Protocol ON
  Serial.begin(115200);
}

void loop() {
  if (Serial.available()) {
      str = Serial.readStringUntil('\n');     // Read the serial input
      Serial.println(str);             // sends ascii code

  }
}

Python

import serial


ser = serial.Serial('/dev/ttyACM1', 115200)

for i in range(0,4):
    str = "test string\n"
    ser.write(str)
    print ser.readline()

Upvotes: 1

Views: 3182

Answers (3)

Beefy_Swain
Beefy_Swain

Reputation: 163

The issue is likely related to many Arduinos resetting when a new serial connection is made.

The solution is to either add a delay (about 2 seconds works) to the python program between the serial connection being created and the first data being sent or modifying the hardware to prevent a reset on serial connect.

Upvotes: 2

Lightsout
Lightsout

Reputation: 3767

I added

time.sleep(1)
ser.setDTR(level=0)
time.sleep(1)

after opening the serial port and the issue was fixed.

Upvotes: 1

George Profenza
George Profenza

Reputation: 51847

By default python Serial might be blocking by default try removing the timeout:

ser = serial.Serial('/dev/ttyACM1', 115200,timeout=0)

additionally have a peek at the serial.threaded in the docs

Upvotes: 1

Related Questions