2016-03-05 4 views
0

Я читаю данные о последовательных данных в vPython от Arduino и получаю ошибки данных во время readline. Иногда он читает две строки подряд, и на этот раз он пропустил запятую, как я пытался показать на фотографии. Код ниже.Python неверно читает серийные данные

В чем причина этого?

[IMG] http://i.imgur.com/cAw7De1.png

код Python:

arduinoSerialData=serial.Serial('/dev/cu.usbmodem1421',115200) 
while (1==1): #loops forever 
    rate (30) # tells vPython to run this loop (times/sec) 
    while(arduinoSerialData.inWaiting()==0): 
     pass #do nothing 

    sensorCallInfo = arduinoSerialData.readline() 
    print sensorCallInfo 

    dataNums = sensorCallInfo.split(',') 

    x1 = float(dataNums[0]) 
    y1 = float(dataNums[1]) 
    z1 = float(dataNums[2]) 
    sysCal = int(dataNums[3]) 
    gyroCal = int(dataNums[4]) 
    accelCal = int(dataNums[5]) 
    magCal = int(dataNums[6]) 

    print x1, y1, z1, sysCal, gyroCal, accelCal, magCal 
    print 
    print 

Arduino Код:

#include <Wire.h> 
#include <Adafruit_Sensor.h> 
#include <Adafruit_BNO055.h> 
#include <utility/imumaths.h> 

#define BNO055_SAMPLERATE_DELAY_MS (50) 
imu::Vector<3> linearAccel; 
uint8_t systemcal, gyrocal, accelcal, magcal = 0; 
Adafruit_BNO055 bno = Adafruit_BNO055(55); 

void setup(void) 
{ 
    Serial.begin(115200); 
    while (!Serial); 

    if (!bno.begin()) //checks for sensor to start 
    { 
    Serial.print("No sensor detected. Check wiring or I2C address."); 
    while (1); 
    } 

    bno.setExtCrystalUse(true); 
} 

void loop(void) 
{ 
    bno.getCalibration(&systemcal, &gyrocal, &accelcal, &magcal); 
    linearAccel = bno.getVector(Adafruit_BNO055::VECTOR_LINEARACCEL); 

    outputForPython(); 
    delay(BNO055_SAMPLERATE_DELAY_MS); 
} 


void outputForPython() 
{ 
    Serial.print(linearAccel.x()); Serial.print(","); 
    Serial.print(linearAccel.y()); Serial.print(","); 
    Serial.print(linearAccel.z()); Serial.print(","); 
    Serial.print(systemcal, DEC); Serial.print(","); 
    Serial.print(gyrocal, DEC);  Serial.print(","); 
    Serial.print(accelcal, DEC); Serial.print(","); 
    Serial.print(magcal, DEC);  Serial.println(""); 
} 
+0

Это происходит, если вы настроили свой последовательный порт на скорости 9600 бод? – pyInTheSky

+0

Скорее всего, происходит переключение последовательного порта, поэтому вы получаете неправильное чтение на одном из краев ... https://www.sparkfun.com/tutorials/215 – pyInTheSky

+0

Это происходит при 9600 бодах как Что ж. Я посмотрю учебник, спасибо за ссылку. Я также попробую новый кабель и посмотрю, проблема в этом. Я думаю, что вы правы в отношении шума, потому что иногда последнее чтение перед ошибкой имеет две строки в виде одной строки, что означает, что ошибка чтения несколько отличается каждый раз. –

ответ

0

Вы, скорее всего, получают шум на линии. Вы можете попытаться настроить скорость передачи в бодах или попробовать другой кабель. У Sparkfun есть несколько хороших деталей по этой проблеме: https://www.sparkfun.com/tutorials/215 - альтернативный подход заключается в использовании ethernet для связи вместо последовательного в зависимости от требуемой надежности. Я думаю, что у вас будет больше успеха при более низкой скорости в бодах.

Смежные вопросы