2017-05-12 6 views
0

Ich versuche, eine serielle Daten von NodeMCU zu Arduino zu senden. Ich verwende MicroPython zum Programmieren. Sowie Serial.read auf Arduino. Ich kann erfolgreich senden und empfangen. Aber das Problem ist die NodeMCU sendet Daten zusammen mit Nummer, die nicht benötigt wird. Und Arduino empfängt Daten zusammen mit Nummer. Wenn ich zum Beispiel "Hallo" sende, sendet es als "Hello5". Ich habe verstanden, dass die Zahl nichts anderes ist als die Anzahl der Alphabete in der Zeichenfolge. Wie kann ich das entfernen?Warum NodeMCU Daten mit unerwünschten Nummern sendet?

MicroPython auf NodeMCU:

import os 
import machine 
from machine import UART 
uart = UART(0) 
import time 
while True: 
    uart.write('1') 

Arduino Programm:

String received; 
String msg; 
void setup() { 
    Serial.begin(115200); 
    attachInterrupt(0, light, FALLING);//When arduino Pin 2 is FALLING from HIGH to LOW, run light procedure! 
} 

void light() { 
    Serial.println(msg); 
} 

void loop() 
{ 
    if (Serial.available() > 0){ 
    received = Serial.readStringUntil('\n'); 
    msg = received; 
    } 
} 
+1

Sind Sie sicher, dass 'uart.write (‚1‘)' sendet auch Zeilenendmarke? – KIIV

+0

kann ich es entfernen? – nawas

+0

@KIIV Ja, wenn ich versuche, 1 sendet es als 11. – nawas

Antwort

0

Ich habe gerade überprüft die microPython des UART (http://docs.micropython.org/en/latest/wipy/library/machine.UART.html) und Arduino Serial (https://www.arduino.cc/en/Reference/Serial ), und es scheint, dass Sie eine sind vermisst Initialisierungszeile für UART. Das UART-Dokument gibt an, dass die voreingestellte Baudrate 9600 ist, und Sie erwarten einen 115200 auf dem seriellen Empfänger. Ich glaube, das Einstellen der Baudrate auf jeder Seite hat ein undefiniertes Verhalten.

In Ihrem Python-Code, könnten Sie versuchen, uart.init (115200) nach uart = UART (0) Aufruf (und die Standardwerte für den Rest scheint genauso wie die Erwartungen der Seriell auf Empfänger)?

Serial Dokument sagt auch, dass, wenn es das Zeichen nicht finden kann, die Sie in der readStringUntil() definieren, dann wird es versuchen, bis es ein Timeout. Ich schätze also, dass Ihre Funktionsaufforderung abgelaufen ist, weil sie im Stream keine Endlinie ('\ n') findet, weil Sie keine injiziert haben.

Darüber hinaus, obwohl die Hilfedokumente der Funktionalität, die Sie verwenden, nicht so etwas sagen, wenn Sie wirklich immer die Anzahl der Zeichen als erste Char am Empfänger erhalten, könnte es sich lohnen, zu versuchen das zu deinem Vorteil. Ich frage mich, ob Sie versuchen können, diese Nummer zuerst zu bekommen, dann lesen Sie danach viele Zeichen (auf der Arduino-Empfänger-Seite). Hier einige Code, den ich hoffe, helfen kann (ich habe Angst, ich nicht versuchen, es zu benutzen):

#include <string.h> 
char buffer[256]; // buffer to use while reading the Serial 
memset(buffer, (char)0, 256); // reset the buffer area to all zeros 

void loop() 
{ 
    if (Serial.available() > 0){ 
    int count = Serial.read(); // the first byte that shows the num of chars to read after, assuming that this is a 'byte' - which means we can have max 256 chars in the stream 
    Serial.readBytes(buffer, count); 
    msg = String(buffer); 
    } 
} 
+0

Ich habe Ihren Vorschlag versucht. Wenn ich uart (1) verwende, sendet es nur eine Anzahl von Alphabeten in der Nachricht. – nawas

+0

Auch nach dem Ändern der Baudrate ist das Problem nicht gelöst .. Ich habe einen Code können Sie es teilen? – nawas