2015-12-05 2 views
3

[SOLVED] проблема была связана с чипом USB-TTL PL2303, который я использовал для интерфейса модуля XBee с Pi. Это создавало проблему. Драйверы не были должным образом поддержаны RPi2.Отправка строки из Raspberry Pi в Arduino через модули XBee

Я пытаюсь отправить строку (возможно, число) из скрипта python на моем малине Pi2 через подключенный к нему модуль XBee, в Arduino Uno. Переданные данные неправильно истолковываются на конце Arduino. Когда я использую терминал на X-CTU и отправляю строки через это, он отображается правильно на последовательном мониторе Arduino IDE.

Вот код Python Я использую

import time 
import serial 
ser = serial.Serial("/dev/ttyUSB0",9600) 
ser.isOpen() 
x= '4' 
ser.write(bytes(x, "ascii")) #writing as bytes 
time.sleep(2) 
ser.close() 

Вот код Arduino я использовал

#include <SoftwareSerial.h> 


SoftwareSerial mySerial(10, 11); // RX, TX 

void setup() 
{ 
// Open serial communications 
Serial.begin(9600); 


// set the data rate for the SoftwareSerial port 
mySerial.begin(9600); 
} 

void loop() // run over and over 
{ 
int x; 
if (mySerial.available()) 
    { 

    x = char(mySerial.read()) - '0'; 
    //reading data value from Software Serial port 
    //converting ASCII to int 
    //and storing it as x 
    Serial.print(x); 

    } 
+0

Почему 'ser.write (байты (x," ascii "))', а не просто 'ser.write (x)'? –

+0

Я использую Python 3.3, поэтому он не позволит использовать ser.write() со строковым аргументом. Он должен быть преобразован в байты, которые будут переданы в качестве аргумента. –

ответ

0

Мою догадку, если вы уже типажи в угле, не нужно вычитаем «0», потому что тогда Serial.print() интерпретирует это значение как код ascii и печатает характерный для него характер. Поэтому просто попробуйте char (Serial.read()) и распечатайте его.

+0

Мне нужно строковое значение как целое число, чтобы переключать переключатель реле на это количество минут, поэтому я вычитаю его из «0», –

0

Ну, вы знаете, что код на принимающей стороне работает правильно, потому что вы можете проверить его, отправив данные с терминалом X-CTU. Как вы отправляете из X-CTU? Просто введите номер 4 в окне или отправьте его как шестнадцатеричное значение (0x04)?

Что произойдет, если у вас есть сценарий Python для отправки на терминал X-CTU? Что ты видишь? Что делать, если вы просто сбрасываете значение байта, прочитанного на стороне Arduino, прежде чем делать какие-либо преобразования? Сравните то, что отправляет X-CTU на то, что отправляет Python.

Вместо того, чтобы использовать bytes() для преобразования строки Python, вы можете просто назначить x = b'4' и посмотреть, что это делает.

+0

Когда я использую X-CTU для приема данных из сценария python, он показывает правильно на терминале X-CTU. И когда я отправляю данные с терминала X-CTU в Arduino, он отображается правильно на последовательном мониторе. Проблема возникает, когда я использую скрипт python из Pi и Arduino вместе. Данные, отправленные из Pi, принимаются в качестве тарабарщины на конце arduino. Я просто набираю номер непосредственно в журнале консоли. Код arduino работает правильно при использовании с X-CTU. Я не могу использовать префиксную ноту b, поскольку строка, которую я отправляю, должна быть переменной. –

+0

Должна быть какая-то разница между тем, как данные Python появляются в X-CTU, и как вы отправляете из X-CTU в Arduino. Можете ли вы дать дампу Arduino значения шестнадцатеричных значений, которые он получает перед любым преобразованием, чтобы сравнить то, что вы получаете от Python, и то, что вы получаете от X-CTU? – tomlogic

+0

Я сделал так, как вы сказали, изменив Serial.print (x) на Serial.print (x, HEX), и кажется, что данные, отправляемые кодом python, составляют 32 бита, как показано на последовательном мониторе, и данные, отправляемые X- CTU - 8 бит. Данные кода Python отображаются как последовательность из четырехзначных шестнадцатеричных значений, а данные из X-CTU отображаются как шестизначное значение из двух цифр. –