当前位置: 首页 > 知识库问答 >
问题:

如何从Python向Arduino发送int,以便将其用作Neopix函数setPixelcolor()的参数?

左丘曦
2023-03-14

我正在尝试使用PySerial和从Python向Arduino发送一个整数。编写([data])以使用Python和串行发送。read()串行。readString()在Arduino上接收,然后setPixelColor()。show()。

但它似乎不能正常工作,我不能使用串行监视器,因为我正在发送数据,因为端口会很忙。

我试着自己用Serial输入一个数字。readString()然后将字符串转换为int,最后输入显示LED的my函数。

当我这样做时,它确实能正常工作,但当我发送一些数据时,所有之前点亮的LED突然熄灭,据我所知,这只能由Arduino板复位引起。

这是python代码,它只发送用户选择的int

import serial

a = int(input('Enter pixel position : '))
ser = serial.Serial("COM16", 9600)

ser.write([a])

这是Arduino程序读取输入数据的部分。

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(40, 6, NEO_GRB + NEO_KHZ800);

void setup() {
  // put your setup code here, to run once:
  pixels.begin();
  Serial.begin(9600);
}

void loop() {

  String a = Serial.readString();
  int b = a.toInt();
  pixels.setPixelColor(b, 30,30,30);
  pixels.show();
  Serial.println(a);

  delay(1000);

}

当我发送一些数据时,所有LED都会关闭,除了第一个LED,它的位置对应于中使用的0。setPixelColor()函数。

问题是,发光二极管应该亮到Python发送的相应int(例如,点亮第五个发光二极管,整数为4)。


共有2个答案

柯耀
2023-03-14

您不需要从Python脚本发送int。只需发送一个字符串,然后将其转换回Arduino上的int。此外,如果收到的值有效,您可以在Arduino代码上简单地验证数字。Arduino代码的另一个问题是,您没有检查串行端口的可用性,这将通过Serial返回空字符串。readString()

下面显示了一种简单的方法,但您可以将其扩展到其他像素。

Python脚本

import serial


ser = serial.Serial("COM16", 9600)
while True:
    input_value = input('Enter pixel position: ')
    ser.write(input_value.encode())

Arduino代码:

#define MIN_PIXEL_RANGE 0
#define MAX_PIXEL_RANGE 100

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(40, 6, NEO_GRB + NEO_KHZ800);

void setup()
{
    // put your setup code here, to run once:
    pixels.begin();
    Serial.begin(9600);
}

void loop()
{
    if (Serial.available())
    {
        String a = Serial.readString();
        Serial.print("Received Value: ");
        Serial.println(a);
        int b = a.toInt();
        if ((b >= MIN_PIXEL_RANGE) && (b <= MAX_PIXEL_RANGE))
        {
            pixels.setPixelColor(b, 30, 30, 30);
            pixels.show();
            delay(1000);
        }
    }
}
陈业
2023-03-14

如果使用pip可安装包pySerialTransfer,您可以在Ardinos和Python之间轻松可靠地进行通信。该包是非阻塞的,易于使用,支持可变长度的数据包,自动解析数据包,并使用CRC-8进行数据包损坏检测。

下面是一个Python脚本示例:从pySerialTransfer导入pySerialTransfer作为txfer

if __name__ == '__main__':
    try:
        link = txfer.SerialTransfer('COM13')

        link.txBuff[0] = 'h'
        link.txBuff[1] = 'i'
        link.txBuff[2] = '\n'

        link.send(3)

        while not link.available():
            if link.status < 0:
                print('ERROR: {}'.format(link.status))

        print('Response received:')

        response = ''
        for index in range(link.bytesRead):
            response += chr(link.rxBuff[index])

        print(response)
        link.close()

    except KeyboardInterrupt:
        link.close()

请注意,Arduino将需要使用库SerialTransfer。h、 您可以安装SerialTransfer。h使用Arduino IDE的库管理器。

这里有一个示例Arduino草图:

#include "SerialTransfer.h"

SerialTransfer myTransfer;

void setup()
{
  Serial.begin(115200);
  Serial1.begin(115200);
  myTransfer.begin(Serial1);
}

void loop()
{
  myTransfer.txBuff[0] = 'h';
  myTransfer.txBuff[1] = 'i';
  myTransfer.txBuff[2] = '\n';

  myTransfer.sendData(3);
  delay(100);

  if(myTransfer.available())
  {
    Serial.println("New Data");
    for(byte i = 0; i < myTransfer.bytesRead; i++)
      Serial.write(myTransfer.rxBuff[i]);
    Serial.println();
  }
  else if(myTransfer.status < 0)
  {
    Serial.print("ERROR: ");
    Serial.println(myTransfer.status);
  }
}

最后,请注意,您可以使用这些库的组合来传输int、浮点数、字符等!

 类似资料:
  • 我想发送一个函数作为参数。当我在另一个函数中调用它“this”和其他类似“HttpClient”的函数时,“urlBase”是未定义的。 我在互联网上搜索并找到了关于bind()属性的信息,但如果现在定义了“this”,其他属性仍然没有定义。所以我把所有需要的属性都放在bind()函数中,但对我来说很糟糕。。。 这是我的服务功能,它确实工作得很好。 这是我想给它另一个函数作为参数的函数: 以及之前

  • 我目前正在做一个项目,需要开发一个原生DLL(用C++)来访问Java应用程序。我选择了JNA来做桥接工作,我面临着从Java向C++函数传递正确的int值的问题。 简单地说,我有一个函数在C++中接受一个int值作为参数:(代码被剥离,方法被重命名以保持机密性) 是一种简单的方法,它使用将任何数据类型的值转换为。执行情况如下: 是从我在代码中使用的实际结构重命名的。是的数组。和都是共享内存中的全

  • 我正试图使用串口从C#向Arduino发送一个数组。在C#中,首先是输入字符串 然后,我将其转换为int数组 然后,我将其转换为字节数组,通过串行端口发送 最后,我把它寄出去了 那么,应该由我的Arduino接收 所以recdata应该是一个int数组 但事实并非如此。当我将其打印到另一个串行端口进行检查时。。 我得到3个输出,而不是1个,就好像serialport先发送一个int,然后发送第二个

  • 我试图让Arduino在串口读取字符“s”时触发一个中继。该字符“s”由python根据从屏幕读取的图像发送。 我的问题是arduino似乎无法从串行端口读取数据,因为它从不执行if条件。我的猜测是这两者之间存在某种死锁(这就是为什么我将ardu.close()放在函数foo中) 这是我的arduino代码: 这是我的python代码:

  • 问题内容: 是否可以从数组向JavaScript函数发送可变数量的参数? 我最近写了很多Python,能够接受并发送varargs是一个很棒的模式。例如 是否有可能在JavaScript发送待处理数组 作为 参数数组? 问题答案: 更新 :从ES6开始,您可以在调用函数时简单地使用 传播语法 : 由于ES6还希望将参数视为数组,因此还可以在参数列表中使用传播语法,例如: 并且可以将其与常规参数结合

  • 我正在做一个项目,从Arduino读取模拟数据,然后用zedgraph在Visual C#中显示。我的GUI上有一个开始按钮,可以开始从Arduino读取串行数据。我可以用方法打开arduino端口,读取串行数据,在zedgraph上显示数据,然后每1秒关闭一次arduino。如果你听不懂我的话,这里有一个方法: 当我单击开始按钮时调用此方法。所以,我的问题是,当我点击开始按钮时,我想“打开”发送