Python Serial и CSV для Arduino - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь написать код для чтения значения из Arduino Uno каждые 2 мс.В конце Arduino вот код и то, что он будет отправлять каждые 2 мс.

Serial.print(AngleV);
Serial.print(",");   
Serial.print(AngleH);
Serial.print(",");
Serial.println(distance);

, тогда как значение AngleV составляет от 0 до 180, значение AngleH от 0 до 3600, значение расстояния от 0 до 4000.

На компьютере я хочу прочитать все 3 значения, затем выполнить некоторые вычисления и записать их в файл csv:

x = distance * sin(AngleV)*cos(AngleH)
y = distance * cos(AngleV)*sin(AngleH)
z = distance * cos(AngleV)

Так что в файле .csv это будетбыть чем-то вроде x, y, z .... Пока это то, что я сделал. Может ли кто-нибудь указать мне, что делать дальше?Спасибо за ваше время.

 import serial
    import csv

    # open com port
    ser = serial.Serial('COM4', 115200)
    print (ser.name)

    # create csv file
    with open('C:/Users/sylan/Desktop/Python/datafile.csv', 'w') as new_file:
        csv_writer = csv.writer(new_file)

        while True:
            line = ser.readline()
            print(line)
            if line[0] == "B":
                line = line[1:len(line)]

            if line[len(line)-2] == "E":
                line = line[:(len(line)-2)]
                csv_writer.writerow([line])

                print('\n\nThis is the end of the file\n')
                ser.close()
                break
            else:
                line = line[:(len(line)-1)]
                csv_writer.writerow([line])

Ответы [ 2 ]

0 голосов
/ 19 июня 2018
import csv
import serial
import math
import time
# Open com port
ser = serial.Serial('COM4', 115200)
print('Serial Port is open : ' + ser.name)
with open("datafile.csv", "w") as new_file:
    csv_writer = csv.writer(new_file)
    time.sleep(3)
    ser.write(b'B')

    while ser.is_open:
            line = ser.readline()
            print(line)

            # If line starts with B, strip the B
            if line[0] == "B":
                line = line[1:len(line)]

            # If the line ends with E, we reached the last line
            # We strip the E, and keep in mind that the serial
            # reader should be closed
            if line[len(line)-2]=="E":
                line = line[:(len(line)-2)]
                v,h,d=line.split(",")
                polar = float(v)
                azimuthal = float(h)
                distance = float(d)
                x=float(distance*math.sin(polar)*math.cos(azimuthal))
                y=float(distance*math.sin(polar)*math.sin(azimuthal))
                z=float(distance*math.cos(polar))
                # Write XYZ to the CSV file
                csv_writer.writerow([x, y, z,distance])
                print('\nThis is the end of the file\n')
                ser.close()
                break
            else:
                line = line[:(len(line)-1)]
                v,h,d=line.split(",")
                if len(v)>3 or len(h)>4 or len(d)>4:
                    print('Ignored invalid line: ')
                    continue
                # Convert the numbers from string format to integer
                polar = float(v)
                azimuthal = float(h)
                distance = float(d)
                x=float(distance*math.sin(polar)*math.cos(azimuthal))
                y=float(distance*math.sin(polar)*math.sin(azimuthal))
                z=float(distance*math.cos(polar))
                # Write XYZ to the CSV file
                csv_writer.writerow([x, y, z,distance])
0 голосов
/ 10 июня 2018

Я предполагаю два подхода в зависимости от формата, который отправляется платой Arduino.

  1. Первая строка начинается с буквы B, а последняя строка заканчивается буквой E.
  2. Каждая строка начинается с буквы B и заканчивается буквой E.

Подход 1

В этом случае мы рассчитываем увидеть букву "E", чтобы узнать, когдапрекратить чтение из файла.

import csv
import serial

# Open com port
ser = serial.Serial('COM4', 115200)

with open("datafile.csv", "w") as new_file:
    csv_writer = csv.writer(new_file)

    while True:
        # Strip whitespace on the left and right side
        # of the line
        line = ser.readline().strip()

        # If line starts with B, strip the B
        if line.startswith("B"):
            line = line[1:]

        # If the line ends with E, we reached the last line
        # We strip the E, and keep in mind that the serial
        # reader should be closed
        should_close = False
        if line.endswith("E"):
            line = line[:-1]
            should_close = True

        # Split the string "180,3600,1234" into a list ["180", "3600", "1234"]
        xyz_string_triplet = line.split(",")
        if len(xyz_string_triplet) != 3:
            print("Ignored invalid line: " + line)
            continue

        # Convert the numbers from string format to integer
        x = int(xyz_string_triplet[0])
        y = int(xyz_string_triplet[1])
        z = int(xyz_string_triplet[2])

        # Write XYZ to the CSV file
        csv_writer.writerow([x, y, z])

        # If we reached the last line, we close
        # the serial port and stop the loop
        if should_close:
            ser.close()
            break

Подход 2

В этом случае, поскольку все строки заканчиваются на E, у нас нет никакого способа узнать, когда прекратить обработку строк,По этой причине мы выбираем произвольно остановить чтение после 10 строк.

import csv
import serial

# Open com port
ser = serial.Serial('COM4', 115200)

with open("datafile.csv", "w") as new_file:
    csv_writer = csv.writer(new_file)

    line_count = 0
    while True:
        # Strip whitespace on the left and right side
        # of the line
        line = ser.readline().strip()

        # Check whether line starts with a B and ends
        # with an E, and ignore it otherwise
        is_valid = line.startswith("B") and line.endswith("E")
        if not is_valid:
            print("Ignored invalid line: " + line)
            continue

        # Strip B and E
        xyz_line = line[1:-1]

        # Split the string "180,3600,1234" into a list ["180", "3600", "1234"]
        xyz_string_triplet = xyz_line.split(",")
        if len(xyz_string_triplet) != 3:
            print("Ignored invalid XYZ line: " + xyz_line)
            continue

        # Convert the numbers from string format to integer
        x = int(xyz_string_triplet[0])
        y = int(xyz_string_triplet[1])
        z = int(xyz_string_triplet[2])

        # Write XYZ to the CSV file
        csv_writer.writerow([x, y, z])

        # Increment the line count, and stop the loop
        # once we have 10 lines
        line_count += 1
        if line_count >= 10:
            break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...