Für ein kleines Projekt möchte ich unter Python Werte vom Arduino darstellen. In Python nutze ich hierbei das pyserial Modul, welches plattformunabhängig sehr einfach eine serielle Verbindung aufbaut.
Unter Python wird eine Anfrage gestellt, die der Arduino mit Werten definierter Größe beantwortet. Unter Arduino werden die Werte je nach Größe mit den Funktionen serial_uint8 bis serial_uint32 in einzelne Bytes (little-endian) geteilt. Auf der Gegenseite unter Python wird mit dem struct-Modul das Bytearray nach einer vorgegebenem Format wieder in einzelne Bytes entteilt.
Die Python Struct-Formate findet man hier. Die PySerial Dokumentation gibt es hier.
Python-Code:
import serial import time import struct """ setup serial for arduino """ ser = serial.Serial() ser.port = 2 ser.baudrate = 9600 """ open serial port """ ser.open() while 1: """ request values from arduino """ ser.write("s") """ wait until all bytes were read """ while ser.inWaiting() != 0: """ unpack format, little endian """ unpack_fmt = "<BLbHHHH" """ read bytes as described in unpack_fmt """ val = ser.read(size=struct.calcsize(unpack_fmt)) """ display values """ print struct.unpack(unpack_fmt, val) time.sleep(1)
Arduino-Code:
void setup() { Serial.begin(9600); } uint8_t serial_buffer[128]; uint8_t serial_buffer_pos = 0; void serial_uint8(uint8_t val) { serial_buffer[serial_buffer_pos++] = (val & 0xFF); } void serial_uint16(uint16_t val) { serial_buffer[serial_buffer_pos++] = (val & 0xFF); serial_buffer[serial_buffer_pos++] = (val >> 8) & 0xFF; } void serial_uint32(uint32_t val) { serial_buffer[serial_buffer_pos++] = (val & 0xFF); serial_buffer[serial_buffer_pos++] = (val >> 8) & 0xFF; serial_buffer[serial_buffer_pos++] = (val >> 16) & 0xFF; serial_buffer[serial_buffer_pos++] = (val >> 24) & 0xFF; } void serial_init() { serial_buffer_pos = 0; } void serial_send() { for (int i = 0; i < serial_buffer_pos; i++) { Serial.write(serial_buffer[i]); } } int readByte = 0; void loop() { if (Serial.available() > 0) { readByte = Serial.read(); switch (readByte) { case 's': serial_init(); serial_uint8(1); serial_uint32(millis()); serial_uint8(100); serial_uint16(random(8, 2200)); serial_uint16(random(8, 2200)); serial_uint16(random(8, 2200)); serial_uint16(random(8, 2200)); serial_send(); break; case 'r': serial_init(); serial_uint8(random(0, 250)); serial_send(); break; } } }
Das Ergebis sieht so aus:
(1, 1375424, 100, 1463, 927, 1220, 715) (1, 1376425, 100, 663, 1552, 470, 308) (1, 1377426, 100, 923, 711, 1963, 571) (1, 1378427, 100, 732, 1259, 618, 1629) (1, 1379428, 100, 1493, 378, 396, 80) (1, 1380429, 100, 1115, 753, 409, 1894) (1, 1381431, 100, 1968, 1328, 287, 413) (1, 1382431, 100, 135, 1310, 1237, 823) (1, 1383433, 100, 794, 1352, 1923, 439) (1, 1384433, 100, 550, 632, 116, 175)