我正在尝试使用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)。
您不需要从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);
}
}
}
如果使用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。如果你听不懂我的话,这里有一个方法: 当我单击开始按钮时调用此方法。所以,我的问题是,当我点击开始按钮时,我想“打开”发送