第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文章
7939浏览量
264502 -
python
+关注
关注
56文章
4793浏览量
84631 -
Arduino
+关注
关注
188文章
6469浏览量
186963
发布评论请先 登录
相关推荐
评论