第1步:计算机环境
在计算机方面,我们将使用一个称为PySerial的Python模块。巧合的是,PySerial允许通过Python使用串行连接。在Windows上安装PySerial是一个非常简单的过程。 注意:此“假设”假设您已安装Python 2. *!如果您不这样做,PySerial仍然可以使用,但是您可能需要稍微更改代码以适应新标准。
要在Windows上安装,只需访问PySerial的下载页面,下载Windows二进制文件并运行它(在撰写本文时为pyserial-2.7.win32.exe)。然后,通过打开新的Python解释器实例并运行以下命令来测试安装:
import serial
步骤2:初始连接

要从Python启动与Arduino的连接,我们首先必须确定Arduino处于哪个 COM端口。幸运的是,Ardunio编程环境使此任务变得简单。
只需查看Arduino IDE的右下角,您将看到一些包含COM端口号的文本。我们将使用它来启动我们的Python串行连接,如下所示:
arduino = serial.Serial(‘COM1’, 115200, timeout=.1)
上面的代码将在“ COM1”上使用“ 115200”波特创建一个名为“ ardunio”的新串行对象,速率和.1秒超时。保持选定的波特率非常重要,因为它必须与Ardiuno端的波特率完全匹配。
第3步:Ardiuno与Python的通信

在Ardunio和Python之间进行通信比通过其他方式更容易。首先,我们需要一些代码来启动Ardunio的串行连接,并传递一条消息。我们可以使用Arduino的Serial.write()函数来做到这一点,就像这样:
void setup() {
Serial.begin(115200); // use the same baud-rate as the python side
}
void loop() {
Serial.println(“Hello world from Ardunio!”); // write a string
delay(1000);
}
这段代码将编写一个“来自Ardunio的Hello world!”。每秒一次连接到串行连接。现在,我们将构建一个Python脚本,该脚本能够接收这些消息,并根据需要对其进行处理。首先,我们必须像上一页一样启动连接,然后创建一个循环,该循环从流中获取当前信息,并将其打印到控制台。
import serial
arduino = serial.Serial(‘COM1’, 115200, timeout=.1)
while True:
data = arduino.readline()[:-2] #the last bit gets rid of the new-line chars
if data:
print data
请注意,在这种情况下,readline()处于阻塞状态,因此它将等待直到新行完全通过串行缓冲区为止。通常,readline()会占据空白行,因此我放入了if语句来检查数据是否实际包含任何内容。如果您想更精确地获取非阻塞数据,则可以在Arduino端使用read()并使用Serial.write()(用于字节)或Serial.print()(用于ASCII字符),但是您需要
第4步:Python与Arduino通讯

这一步有点难,因为这需要我们在事物的Arduino方面解析数据。为了帮助加快速度,我继续编写了一个简单的循环,该循环从Serial缓冲区中获取当前数据,并创建一个以Null结尾的字符串(C字符串),然后将其传递回Serial连接。您可以使用此技术来编写实际的解析器,方法是指定自己的数据包前缀和后缀,然后在串行缓冲区中扫描这些内容,并相应地创建字符串。
void setup() {
Serial.begin();
}
void loop() {
if(Serial.available() 》 0) {
char data = Serial.read();
char str[2];
str[0] = data;
str[1] = ‘’;
Serial.print(str);
}
}
现在我们可以编写一个简单的脚本,将数据从Python发送到Arduino,然后打印出返回的内容。
import serial, time
arduino = serial.Serial(‘COM1’, 115200, timeout=.1)
time.sleep(1) #give the connection a second to settle
arduino.write(“Hello from Python!”)
while True:
data = arduino.readline()
if data:
print data.rstrip(‘ ’) #strip out the new lines for now
# (better to do .read() in the long run for this reason
不难看出如何进一步扩展此方法以允许两个设备之间进行复杂的通信。我将在以后的“ ible”中介绍这种通信的一个示例,在该示例中,我将制作一种能够在任何PC游戏上工作的游戏手柄设备!
-
usb
+关注
关注
60文章
8377浏览量
281919 -
python
+关注
关注
57文章
4860浏览量
89647 -
Arduino
+关注
关注
190文章
6516浏览量
196054
发布评论请先 登录
Texas Instruments USB-TO-GPIO2接口适配器技术解析
基于USB的多虚拟设备通信
STM32H747的USB无法连接到电脑,电脑提示“未知USB设备,(设备描述符请求失败)”,怎么解决?
STM32H747 的USB口,烧录程序就损坏,提示“NO DFU capable USB device available”怎么解决?
带有USB C的便携式设备可以通过USB C转USB A电缆连接到计算机的USB A吗?
通过USB对I2C进行编程,CONTROL IN传输失败的原因?怎么解决?
请问k230可否和树莓派通过USB-typeC线来通信?
有没有大神使用cubeMX生成初始代码开发实现通过USB(HID)进行OTA升级功能的?
通过Arduino Nano Matter开发板构建智能卷帘系统
有没有什么方案能实现直接用matlab或python调用D4100_usb.dll?
Python Connector for InterBase连接解决方案
EE-213:Blackfin处理器通过异步存储器接口进行主机通信

怎样通过USB进行Arduino Python通信
评论