У меня есть arduino, подключенный к pi через usb, и он отправляет показания с датчика DHT, используя простую программу, приведенную ниже (этот бит работает, как и ожидалось, на последовательном мониторе arduino):
int chk = DHT.read11(DHT_PIN);
Serial.println(DHT.temperature,1);
delay(2000);
Затем у меня есть программа на Python, которая должна получать данные из последовательного порта:
import serial
conn = serial.Serial('/dev/ttyACM0',9600)
temp = conn.readline()
print temp
Этот скрипт затем вызывается в PHP с помощью $temp = shell_exec('python temp.py 2>&1');
который работает нормально, но значения, которые я получаю из серийного номера, неверны.
Ожидаемый результат должен быть что-то вроде 23.0
но когда я обновляю страницу (или даже запускаю скрипт python в терминале), я получаю такие значения, как 2323.0
, 23.023.0
, 22..0
а также 2
, Они постоянно меняются и очень редко выходят в нужном формате.
Кажется, что данные из последовательного порта перекрываются, хотя Serial.println()
Функция помещает его в новую строку. Если бы кто-то мог сказать мне, как исправить это, это было бы очень ценно.
пытаться print repr(temp)
… или даже print temp.strip()+" . "
Я очень сильно подозреваю, когда вы читаете, вы получаете
"23.0\r"
\r
возвращает курсор в начало строки
если вы делаете print "23.0\rB"
ты увидишь "B3.0"
(т.е. я думаю, что вы видите перекрытие только потому, что печатаете его …)
РЕШИТЬ
Я посмотрел вокруг на нескольких сайтах и нашел эту страницу http://www.elinux.org/Serial_port_programming довольно полезно Я посмотрел на часть кода и заметил, что с моим исходным кодом внутри serial.Serial(...)
Я только что ввел скорость передачи после запятой без указания baudrate=9600
,
import serial
port = serial.Serial('/dev/ttyACM0',baudrate=9600,timeout=3.0)
temp = port.readline()
print data
Этот код, похоже, решил проблему! Вот скриншот этого в действии http://gyazo.com/22e7801fd0d7cdf2873e627bb8b88fdc.