无法将字符串从python发送到arduino

戴维·马丁斯

因此,我试图创建一个简单的程序,使我可以用计算机控制RGB LED的颜色。为了控制颜色,我在python 3上创建了一个带有tkinter的小窗口,但是问题是当我尝试更改颜色时,它根本没有响应。我不知道发生了什么事。我试图将字符串放入arduino代码中,但可以解决问题,但是当我通过串行通信发送时,它根本没有响应。

Arduino代码

//pin layout
int   red = 12;
int green = 11;
int  blue = 10;

//string that will receive
String    data;
String subData;

//Color values
int value[3];

void setup() {
  Serial.begin(9600);
  pinMode(red,OUTPUT);
  pinMode(green,OUTPUT);
  pinMode(blue,OUTPUT);  
  }

void loop() {
  while(Serial.available() == 0);
    data = Serial.readString();

    int initialVal =0;
    int val;

    int pos = 0;

    do{
    val = data.indexOf(',',initialVal);
    subData = data.substring(initialVal,val);
    value[pos] = subData.toInt();
    pos = pos + 1;
    initialVal = val + 1;
    }while(val != -1);
    Serial.println(data);
    analogWrite(red,value[0]);
    analogWrite(green,value[1]);
    analogWrite(blue,value[2]);  


  }

这是python代码:

from tkinter import *
from serial import *


window = Tk()
#all definitions for the window
window.title("RGB LED control Panel")
window.geometry("300x180")
window.resizable(False,False)

Title = Label(window, text = "RGB control", width = 15)
Title.grid(row = 0, column = 0, columnspan = 3)

Explanation = Label(window, text = "  This window controls the \ncolor of an RGB LED. Have \n fun!!!")
Explanation.grid(row =1 , column = 3)

RedTitle = Label(window, text = "Red", width = 5, bg = "Red")
RedTitle.grid(row = 1, column = 0)

GreenTitle = Label(window, text = "Green", width = 5, bg = "Green")
GreenTitle.grid(row = 1, column = 1)

BlueTitle = Label(window, text = "Blue", width = 5, bg = "Blue")
BlueTitle.grid(row = 1, column = 2)


RedScale = Scale(window, from_ = 0, to = 255, orient = VERTICAL)
RedScale.grid(row = 2, column = 0)

GreenScale = Scale(window, from_ = 0, to = 255, orient = VERTICAL)
GreenScale.grid(row = 2, column = 1)

BlueScale = Scale(window, from_ = 0, to = 255, orient = VERTICAL)
BlueScale.grid(row = 2, column = 2)

#now the serial com with the arduino

arduino = Serial()
arduino.baudrate = 9600
arduino.port = "COM3"
arduino.open()

while 1:
    window.update_idletasks()
    window.update()

    RED = str(RedScale.get())
    GREEN = str(GreenScale.get())
    BLUE = str(BlueScale.get())

    finalString = RED + "," + GREEN + "," + BLUE

    arduino.write(finalString.encode("utf-8"))
    print(finalString)
    print("\n")

更新

因此,为此更改arduino代码(在接收字符串的部分):

  while(Serial.available() == 0);
  data = Serial.readStringUntil('\n');
  Serial.setTimeout(0.01);

以及将字符串发送到此的python代码部分:while 1:window.update_idletasks()window.update()

    RED = str(RedScale.get())
    GREEN = str(GreenScale.get())
    BLUE = str(BlueScale.get())

    finalString = RED + "," + GREEN + "," + BLUE + "\n"
    if lastMsg != finalString:
        finalString= finalString.encode("utf-8")
        arduino.write(finalString)
        lastMsg = finalString

    print(finalString)

LED会更改其颜色,但有时会更改为其他颜色,并且python程序崩溃!!!Serial.readStringUntil(“ \ n”)或arduino.write(finalString)中是否缺少任何内容?

帕特里克·特伦丁

您正在一次又一次地向Arduino发送太多消息,所以发生的事情是,当它调用readString()时,它需要一个很长的字符串,并超过合法间隔,这意味着您正在破坏,并且从那里可以发生。pos0..2memory stack


建议的修复程序:

  1. 更换Serial.readString()Serial.readStringUntil('\n')返回时超时,而后者返回时,它匹配新行字符超时默认超时是1秒

  2. 改变

    finalString = RED + "," + GREEN + "," + BLUE
    

    finalString = RED + "," + GREEN + "," + BLUE + "\n"
    

    并删除 print("\n")

  3. 更改您的python代码,以便仅在消息内容更改为wrt时才Arduino发送消息发送的最后一个:

    last_msg = ""
    while 1:
        window.update_idletasks()
        window.update()
    
        RED = str(RedScale.get())
        GREEN = str(GreenScale.get())
        BLUE = str(BlueScale.get())
    
        finalString = RED + "," + GREEN + "," + BLUE + "\n"
    
        if finalString != last_msg:
            arduino.write(finalString.encode("utf-8"))
            last_msg = finalString
    
            print(finalString)
    

注意01:即使在修复它之后,也可以考虑将Arduino代码发布代码审查中,以获取有关代码样式强大设计的一些反馈

注02:即使所提出的修正,该源代码仍然脆弱错误的行为给予正确的一组的情况下(例如:如果发生了什么readStringUntil()超时前\n?匹配你怎么跟部分输入处理)


编辑1:Python代码崩溃是由于事实,你不检查对象的有效性RedScaleGreenScaleBlueScale与访问之前get(),这显然失败之后TK窗口 被关闭

一个天真的解决办法是以下几点:

import sys
import time

global exitFlag
exitFlag = False

...

def endProgram():
    global exitFlag
    exitFlag = True
    window.destroy()

window.protocol("WM_DELETE_WINDOW", endProgram)

...

last_msg = ""
finalString = ""
while 1:
    if not exitFlag:
        window.update_idletasks()

    if not exitFlag:
        window.update()

    if not exitFlag:
        RED = str(RedScale.get())
        GREEN = str(GreenScale.get())
        BLUE = str(BlueScale.get())

        finalString = RED + "," + GREEN + "," + BLUE + "\n"

    if finalString != last_msg:
        arduino.write(finalString.encode("utf-8"))
        last_msg = finalString

        print(finalString)

     if exitFlag:
         sys.exit()

需要注意的是,虽然计算器人满为患了人建议这个解决方案,我认为这是糟糕的设计,我怀疑还是马车正确的解决方案是重写Scale实例事件侦听,以便仅当用户实际更改Scale的值时才读取和发送Scale的值。我会让你弄清楚细节。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法将字符串发送到INSERT查询

来自分类Dev

无法使用outputStreamWriter()将字符串从应用程序发送到servlet

来自分类Dev

无法使用AJAX将值发送到PHP字符串

来自分类Dev

无法将字符串从一帧发送到另一帧

来自分类Dev

我无法将活动的数据(字符串)发送到活动中包含的片段

来自分类Dev

Java:将字符串发送到输入流

来自分类Dev

将大字符串Ajax发送到PHP

来自分类Dev

将iOS字符串发送到PHP

来自分类Dev

将字符串从服务发送到活动

来自分类Dev

将HostApp中的字符串发送到SmartExtension

来自分类Dev

将消息(字符串)从文件发送到MainActivity

来自分类Dev

使用ajax将字符串发送到ActionResult

来自分类Dev

将字符串发送到 UnityWebGL jslib

来自分类Dev

将字符串从活动发送到片段

来自分类Dev

通过 Winsock 将字符串发送到 HDFS

来自分类Dev

如何使用串行通信将数据作为字符串从 NodeJs 运行时发送到 Arduino 板?

来自分类Dev

通过服务器将字符串发送到python脚本

来自分类Dev

python将十六进制字符串发送到串行端口

来自分类Dev

如何使用Flask将字符串从python发送到HTML元素

来自分类Dev

如何将HTML字符串从Javascript发送到Flask(python)?

来自分类Dev

无法使用jQuery AJAX函数将具有字符串内容的jQuery变量发送到PHP?

来自分类Dev

res.send() 无法将整个 base64 字符串发送到客户端

来自分类Dev

使用Django将HTML输入中的值(字符串)发送到python脚本(views.py)

来自分类Dev

使用Python的Pyserial将字符发送到Arduino串行端口

来自分类Dev

将字符串发送到书签后,将单词书签中的字符串返回到excel

来自分类Dev

将串行通信(Ubuntu,Python)发送到Arduino

来自分类Dev

使用pyserial将数据从python发送到arduino

来自分类Dev

使用pyserial将数据从python发送到arduino

来自分类Dev

SolidWorks C#插件-将字符串发送到宏

Related 相关文章

  1. 1

    无法将字符串发送到INSERT查询

  2. 2

    无法使用outputStreamWriter()将字符串从应用程序发送到servlet

  3. 3

    无法使用AJAX将值发送到PHP字符串

  4. 4

    无法将字符串从一帧发送到另一帧

  5. 5

    我无法将活动的数据(字符串)发送到活动中包含的片段

  6. 6

    Java:将字符串发送到输入流

  7. 7

    将大字符串Ajax发送到PHP

  8. 8

    将iOS字符串发送到PHP

  9. 9

    将字符串从服务发送到活动

  10. 10

    将HostApp中的字符串发送到SmartExtension

  11. 11

    将消息(字符串)从文件发送到MainActivity

  12. 12

    使用ajax将字符串发送到ActionResult

  13. 13

    将字符串发送到 UnityWebGL jslib

  14. 14

    将字符串从活动发送到片段

  15. 15

    通过 Winsock 将字符串发送到 HDFS

  16. 16

    如何使用串行通信将数据作为字符串从 NodeJs 运行时发送到 Arduino 板?

  17. 17

    通过服务器将字符串发送到python脚本

  18. 18

    python将十六进制字符串发送到串行端口

  19. 19

    如何使用Flask将字符串从python发送到HTML元素

  20. 20

    如何将HTML字符串从Javascript发送到Flask(python)?

  21. 21

    无法使用jQuery AJAX函数将具有字符串内容的jQuery变量发送到PHP?

  22. 22

    res.send() 无法将整个 base64 字符串发送到客户端

  23. 23

    使用Django将HTML输入中的值(字符串)发送到python脚本(views.py)

  24. 24

    使用Python的Pyserial将字符发送到Arduino串行端口

  25. 25

    将字符串发送到书签后,将单词书签中的字符串返回到excel

  26. 26

    将串行通信(Ubuntu,Python)发送到Arduino

  27. 27

    使用pyserial将数据从python发送到arduino

  28. 28

    使用pyserial将数据从python发送到arduino

  29. 29

    SolidWorks C#插件-将字符串发送到宏

热门标签

归档