Я предполагаю два подхода в зависимости от формата, который отправляется платой Arduino.
- Первая строка начинается с буквы B, а последняя строка заканчивается буквой E.
- Каждая строка начинается с буквы 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