0

NodeMCU から Arduino にシリアル データを送信しようとしています。プログラミングには MicroPython を使用しています。Serial.readArduinoでも同様です。正常に送受信できます。しかし問題は、NodeMCU が不要な番号とともにデータを送信することです。そしてArduinoは数値とともにデータを受け取ります。たとえば、「Hello」を送信すると、「Hello5」として送信されます。数字は文字列のアルファベットの数に他ならないことがわかりました。どうすればこれを削除できますか?

NodeMCU 上の MicroPython:

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

Arduino プログラム:

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;
   }
}
4

1 に答える 1

0

microPython の UART ( http://docs.micropython.org/en/latest/wipy/library/machine.UART.html ) と Arduino のシリアル ( https://www.arduino.cc/en/Reference/Serial ) を確認しました。 )、そして UART の初期化行が 1 つ不足しているようです。UART ドキュメントには、設定されるデフォルトのボー レートが 9600 であると記載されており、シリアル レシーバーでは 115200 が期待されます。両側で異なるボーレートを設定すると、未定義の動作が発生すると思います。

あなたの python コードでは、uart = UART(0) 呼び出しの後に uart.init(115200) を試すことができますか (残りのデフォルト値は、受信機に対するシリアルの期待と同じようです)。

また、Serial ドキュメントによると、readStringUntil() で定義した文字が見つからない場合は、タイムアウトになるまで試行します。したがって、ストリームにエンドライン(「\ n」)が見つからないため、関数呼び出しがタイムアウトすると思います。注入しなかったためです。

また、使用している機能のヘルプドキュメントにはそのようなことは記載されていませんが、受信側で常に最初の文字として文字数を取得する場合は、それを有利に利用してみる価値があるかもしれません。 . 最初にその数を取得してから、後でその数の文字を読み取ることができますか? (Arduinoレシーバーサイトで)。ここに役立つと思われるいくつかのコードがあります(私はそれを使用しようとしなかったのではないかと心配しています):

#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);
   }
}
于 2017-05-13T03:50:38.097 に答える