当前位置: 首页 > 面试题库 >

pySerial在Python解释器中可以正常工作,但不能独立运行

楚嘉玉
2023-03-14
问题内容

早上好!最近,我买了一个Arduino开发板来对房间进行“灯光控制”。这是我编写的固件代码:

int control = 0;
int pin = 0;

void setup()
{
  Serial.begin(9600);
  for(pin = 0; pin <= 13; pin++) pinMode(pin, OUTPUT);
}

void loop()
{
  control = Serial.read();
  if (control > 0 && control <= 13) digitalWrite(control, HIGH);
  if (control < 256 && control >= (256-13)) digitalWrite((256-control), LOW);
}

之后,我使用了Python解释器中的pySerial来控制引脚,一切工作正常。这是一段解释器输出:

Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> ser = serial.Serial('/dev/ttyUSB0', 9600)
>>> ser.write(chr(12))
>>> # The light turned on here
... 
>>> ser.write(chr(256-12))
>>> # The light turned off here
...

然后,我决定编写一个简单的Python脚本来执行相同的操作:

#!/usr/bin/env python

import serial
import time

ser = serial.Serial('/dev/ttyUSB0', 9600)

ser.write(chr(12))
time.sleep(1)
ser.write(chr(256-12))

但这根本不起作用!Arduino显示在我启动脚本的过程中收到了一些东西,但是什么也没发生。这是脚本的strace输出:

open("/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NONBLOCK) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_START or TCSETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
open("/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NONBLOCK) = 4
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(4, SNDCTL_TMR_START or TCSETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
write(4, "\f", 1)                       = 1
close(4)                                = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f45cf4c88f0}, {0x4d9820, [], SA_RESTORER, 0x7f45cf4c88f0}, 8) = 0
exit_group(0)                           = ?

看起来一切都应该很好,所以我不知道问题可能出在哪里。我将不胜感激,在此先感谢您!

PS当我在PDB下运行该程序时,一切正常。Heisenbug。

更新:我让控制器将接收到的数据发回给我,并且在运行脚本时似乎什么也没接收到,但是当我从解释器发送数据时,接收到了所有内容。固件的代码现在如下所示:

int control = 0;
int pin = 0;

void setup()
{
  Serial.begin(9600);
  for(pin = 0; pin <= 13; pin++) pinMode(pin, OUTPUT);
}

void loop()
{
  if (Serial.available() > 0)
  {
    control = Serial.read();
    if (control <= 13) digitalWrite(control, HIGH);
    if (control < 256 && control >= (256-13)) digitalWrite((256-control), LOW);
    Serial.println(control);
  }
}

问题答案:

我认为这可能是打开串行端口和发送数据之间的竞争状态。我可能会在打开和写入调用之间进行睡眠。

另外,您可能不想打开这个库“ serial”,而是直接打开并直接写入设备,这可能是在做一些有趣的事情(请参阅其他文章中提到的double open)



 类似资料:
  • 我试图将一个由点组成的GeoJSON层从EPSG:4326重新投影到EPSG:3857。当我在一个独立的程序中运行下面的代码时(如下所示),输出与预期一样。 上述代码的输出为: 然而,当我使用完全相同的代码创建一个函数时,输出是EPSG: 3857中的shapefile,其中所有点的坐标都是0.00000, 0.00000。大多数时候,这甚至不会在QGIS中显示。此函数的输入参数是要重新项目的Ge

  • 当我(从片段内部)调用runOnUiThread()中隐藏键盘时,键盘会隐藏,但当我从activity.getCurrentFocus().post()中执行同样的操作时,键盘不会隐藏。 1)以下代码工作 能不能有人好心解释一下,提前谢谢!

  • 问题内容: 我们正在经历升级数据库软件的过程,还将从Tomcat 5.5升级到Tomcat7。结果,我使用的是新的JDBC驱动程序,在本例中为推荐的SQL Anywhere JDBC 4.0驱动程序,它需要ODBC服务。 我将其全部用于Eclipse方面取得了巨大的成功。但是奇怪的是,当我尝试在Eclipse之外运行Tomcat时,出现以下错误: 我 可以 得到一个纯Java驱动程序(jConne

  • 我正在尝试使用和perl正则表达式在R中拆分字符串。该字符串由用句点或连字符分隔的各种字母数字标记组成,例如。我想拆分字符串: 只要出现连字符 无论何时出现句点 令牌的第二个字符和第三个字符之间的长度正好为3个字符,由2个数字和1个大写字母组成,例如,产生(但不拆分、、、和) 例如,应该产生。 我当前的正则表达式是

  • 我有一个对soap Web服务的请求,该服务在SoapUi中运行良好。我想在python脚本中调用此Web服务。 我尝试了一些模块:zeep,泡沫,...但是我总是有一个SSL错误。 以下是信息: https://37.71XXXXXXACONYX?wsdl 基本认证:用户名密码 身份验证类型:抢占式 我在SoapUi中提供了xml。 有人有什么想法吗? 谢谢!! 我试过:

  • 我试图做一个文件上传到一个链接(共享点Rest服务),在chrome浏览器中工作良好,但不是在android WebView。 我知道android webview有很多限制,但我尝试使用以下方法上传一个文件 https://github.com/mgks/os-fileup 它打开浏览器,但它不显示文件名,也不上传任何内容或调用服务,但同样的代码在chrome浏览器中运行良好(请注意,我已经启用