开发者

PySerial App runs in shell, by not py script

I have a very simple python script that uses pySerial to send data over the serial port to my Arduino. When I execute t开发者_如何学Chis line-by-line in the python shell, it works just fine, but when I put it in a ".py" file, and try to run it, nothing happens. Though the serial lights on my UART do flash. So something is getting through, but it's garbage (I checked).

Here is the simple code.

import serial

ser = serial.Serial('COM3',9600,timeout=.2)
ser.write('A')
ser.close()

I've already tried adding sleeps, but nothing seems to be fixing it. Any ideas?


OK, I've figured it out!

It's necessary to use code like this before performing the write:

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

Otherwise, the arduino automatically resets upon receiving a serial connection for some reason. yay!


import serial
import time 

ser = serial.Serial('/dev/ttyACM1', 9600, timeout=1)
time.sleep(3)      # this will needed for initializing arduino
serial.write(b'1') # b is necessary for byte


I've noticed that if you're on Windows 64-bit then the pyserial simply does not work. I'm using Python 2.7, and after installing the x86 version via the administrator account, and using the mentioned code above

time.sleep(1)

ser.setDTR(level=0)

time.sleep(1)

appended before the write, and remembering the close the port afterwards, I was able to get it to work as a script and not just through the CLI. Also, make sure that you run the python GUI or command line as administrator. This also made a successful difference for me. Also, make sure the serial monitor on the Arduino is closed before running the code.


Maybe be stupid, but try to type only "myscript.py" in cmd.exe, if you are on Windows. I've noticed that on Windows, you do not need to type "python" before script name. This is of course for standard CPython installation on Windows.


May I suggest one more sleep, this time, after you close the serial port.

import serial

ser = serial.Serial('COM3',9600,timeout=.2)

ser.write('A')

ser.close()

time.sleep(3000) 

//for a first test, give a whopping 3 seconds

//sleep(100), 100 ms (0.1 second) may be enough in final product

The rationale is that the computers are becoming so fast (exceed 1 millions time the performance of my first x86 at 4.77 MHz, probably one hundred thousand time faster than the Space Shuttle on board original computer) that it may have time to start Python, execute millions of instructions... close the console, all that before a single byte may have been sent on the serial port.


In my case the following worked.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜