标签: pyserial

如何确保Python while循环需要特定的时间才能运行?

我正在使用while循环读取串行数据.但是,我无法控制采样率.

代码本身似乎需要花费0.2秒才能运行,所以我知道我将无法以更快的速度运行.但我希望能够准确控制我采样的速度.

我觉得我可以使用'sleep'来做到这一点,但问题是有可能在不同的点上循环本身需要更长的时间来读取(取决于通过串行数据传输的精确内容),所以代码会有弥补平衡.

例如,假设我想每1秒采样一次,并且循环需要0.2s到0.3s才能运行.我的代码需要足够智能才能睡眠0.8秒(如果循环需要0.2秒)或0.7秒(如果循环需要0.3秒).

import serial
import csv
import time

#open serial stream
    while True:

        #read and print a line
        sample_value=ser.readline()
        sample_time=time.time()-zero
        sample_line=str(sample_time)+','+str(sample_value)
        outfile.write(sample_line)
        print 'time: ',sample_time,', value: ',sample_value
Run Code Online (Sandbox Code Playgroud)

python serial-port while-loop pyserial python-2.7

5
推荐指数
1
解决办法
5228
查看次数

重新连接几次后,通过 USB 端口与 Python 的串行通信停止工作

我有一个简单的 Python 代码,它通过串行端口使用串行通信连接到 Arduino 板。

我正在使用 Python 库“pyserial”。它是Python2.7

我创建了一个连接,基本上是在做类似的事情

 ser = serial.Serial("/dev/ttyACM0", 115200)
Run Code Online (Sandbox Code Playgroud)

在此之后,我使用 serial.write 向我的 arduino 板发送命令。我有一个自制的固件,可以读取命令并移动一些电机。

此代码正在运行,目前正在运行。虽然我每天连接和断开几次连接和我的机器人做一些事情。我总是刷新所有东西(serial.flush)。在某些时候,它只是失败了。它似乎连接,但没有执行任何操作。就像在某个时候串行端口损坏了一样。

一旦我重新启动计算机,一切正常。

知道如何在不重新启动计算机的情况下修复它吗?

拔下 USB 电缆不起作用。

python usb serial-port arduino pyserial

5
推荐指数
1
解决办法
1695
查看次数

使用 pySerial 读取响应 AT 命令

我有以下示例代码:

import serial

ser = serial.Serial('/dev/ttyUSB1', 115200, timeout=5)
ser.write("AT\r")
response =  ser.readline()
ser.write(chr(26)) 
ser.close()

print response
Run Code Online (Sandbox Code Playgroud)

我的目标是发送AT命令并得到您的回答OK

PySerial readline()的文档说读取接收到的数据,直到找到换行符,问题是我的打印没有返回任何内容。

我确定在AT命令之后,3G 调制解调器发送给我的响应是OK。任何人都知道您无法检索答案的原因?

PS:使用像CuteCom这样的程序,我确认设备可以工作并且它响应AT命令。

python pyserial

5
推荐指数
2
解决办法
3万
查看次数

pySerial write()在Python解释器中工作正常,但不适用于Python脚本

最近,我试图对Arduino进行"轻控制".我使用Raspberry Pi通过串口(USB线)发送控制消息.这是Arduino代码:

int redled = 12;
int whiteled = 48;

void setup()
{
    Serial.begin(9600);
    pinMode(redled,OUTPUT);
    pinMode(whiteled,OUTPUT);
}

void loop()
{
    if(Serial.available())
    {
        char cmd = Serial.read();
        switch(cmd)
        {
            case'r':
            digitalWrite(redled,HIGH);
            delay(2000);
            digitalWrite(redled,LOW);
            break;

            case'w':
            digitalWrite(whiteled,HIGH);
            delay(2000);
            digitalWrite(whiteled,LOW);
            break;
        }
    }
    else
    {
        Serial.println("hello pi");
        delay(1000);
    }

}
Run Code Online (Sandbox Code Playgroud)

之后,我使用Python解释器的pySerial来控制引脚,一切都运行正常.这是一个解释器输出:

Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> ser = serial.Serial('/dev/ttyACM0',9600)
>>> x = ser.read(10)
>>> …
Run Code Online (Sandbox Code Playgroud)

python serial-port arduino pyserial raspberry-pi

5
推荐指数
1
解决办法
5420
查看次数

安装pyserial Mac OS 10.10?

尝试使用Python 2.7与Arduino串行端口通信.已下载pyserial 2.7(在python应用程序文件夹中解压缩并放置文件夹pyserial文件夹).没有工作的错误信息."没有名为pyserial的模块".

对如何从终端安装感到困惑.非常感谢任何帮助.

http://mac.softpedia.com/get/Developer-Tools/pySerial.shtml

python pyserial

5
推荐指数
1
解决办法
2万
查看次数

如何在串行通信中使用 pyserial 解码字节

我是 Python 的初学者。我有一个使用 pyserial 库与串行设备通信的程序。程序向机器发送一个字节的数字并接收字节数作为回复。

我的代码是

   import serial, string
   port = serial.Serial("COM9", 38400, timeout=10.0)
   serial.PARITY_NONE
   serial.EIGHTBITS
   serial.STOPBITS_ONE
   port.write(bytes([53, 1, 4, 0, 83]))
   print("Write done")
   data = port.read(20)

   data1= data.decode('utf-8')
   print(data1)
Run Code Online (Sandbox Code Playgroud)

输出是

   Write done
   Traceback (most recent call last):
   File "C:\Python34\serialcomm.py", line 18, in <module>
   data1= data.decode('utf-8')
   UnicodeDecodeError: 'utf-8' codec can't decode byte 0x84 in position 8:                                                                                                               
   invalid start byte
Run Code Online (Sandbox Code Playgroud)

输出应该是 [53,1,4,0​​,83,53,1,63,83]

如果我排除解码,我得到

  Write done
  b'5\x01\x04\x00S5\x1b\x00\x84S'
Run Code Online (Sandbox Code Playgroud)

python serial-port decode pyserial

5
推荐指数
1
解决办法
2万
查看次数

pyserial中的inter_byte_timeout(interCharTimeout)是什么?

以前interCharTimeout,从3.0版开始inter_byte_timeout.

API:http://pyserial.readthedocs.org/en/latest/pyserial_api.html#serial.Serial.inter_byte_timeout

我怀疑以下是常规timeoutinter_byte_timeout以下之间的区别:

  • timeout:调用read函数时开始倒计时.即使字节不断出现,当从调用读取函数开始经过指定的时间后,它将停止读取/抛出异常.
  • inter_byte_timeout:每次接收到一个字节时,开始倒计时.如果字符在字节之间连续流为fx 1ms,则如果inter_byte_timeout仅大于1ms,则它可以永远继续.

我这是对的吗?

我怀疑没有,因为我只是无法使功能超时.我试过下面的例子.我期待inter_byte_timeout能够读取并打印一个"字符串",因为它们是由arduino写的,每秒一个.相反,它每三秒超时一次,然后打印那段时间内的内容.

写入序列的Arduino草图:

void setup() {
  Serial.begin(9600);
  while(!Serial); //wait for connection
  for (int i=0;true;i++){
    Serial.printf("=== iteration %d ===\n", i);
    delay(1000); //ms
  }
}

void loop() {
}
Run Code Online (Sandbox Code Playgroud)

Python脚本:

import serial
ser=serial.Serial(port='/dev/ttyACM0', timeout=3,inter_byte_timeout=0.01)
for i in range(100):
    a = ser.read(10000)
    print i, len(a), repr(a)
Run Code Online (Sandbox Code Playgroud)

命令行输出:

~$ python test.py
0 60 '=== iteration 0 ===\n=== iteration 1 ===\n=== iteration 2 ===\n'
1 60 …
Run Code Online (Sandbox Code Playgroud)

python pyserial

5
推荐指数
1
解决办法
3490
查看次数

pySerial AttributeError:模块'serial'没有属性'Serial'

我有Windows 7 64位和Python 3.6

我实际上是在挖掘整个网络来解决这个问题 - 而且没有什么可悲的.

AttributeError                            Traceback (most recent call last)
<ipython-input-150-80ee8bd5f0f2> in <module>()
----> serial.Serial()

AttributeError: module 'serial' has no attribute 'Serial'
Run Code Online (Sandbox Code Playgroud)

我尝试通过以下方式解决这个问题: - 检查我的文件是否名为serial.py - 重新安装模块 - 首先,整个模块不起作用,现在只有它的功能. - 我不能使用它的任何功能,检查端口不起作用,没有什么工作. - 我检查了我的点 - 一切都很好,模块在文件夹site-pacages. - 如果我在pySerial文件中执行一些代码 - 它可以工作.但是没有serial.Serial或连接COM端口(我尝试这样做.)

python python-module pyserial

5
推荐指数
1
解决办法
7089
查看次数

Pyserial write() 挂起

我需要使用串行端口与某些设备进行通信。我知道这个设备参数(boudrate 等)。我也知道这个设备会一直等到它收到一个换行符(我不知道 unix 或 windows 类型),然后用 ASCII 发回一些东西。

问题是,当我想写任何东西时,脚本会挂起。没有错误发生,只是以后什么都没有发生。无法打印任何内容,甚至无法关闭端口。

我该如何解决?

它不适用于真正的基本脚本。当然,这不是一个完整的代码,只是一个示例来说明什么不起作用。

可悲的是,我没有找到任何有效的解释或答案。

我正在使用 Ubuntu 16.04

谢谢你的帮助!

import serial

ser = serial.Serial(
port="/dev/NameOfDevice",
baudrate=115200,
bytesize=8,
parity='N',
stopbits=1,
timeout = 0)

ser.open()
print('Port was opened')

ser.write(b'\r\n') #this is a line where it stops working. Different inputs were tried, nothing works.
print('Does it works?')
Run Code Online (Sandbox Code Playgroud)

python pyserial python-3.6 ubuntu-16.04

5
推荐指数
1
解决办法
2559
查看次数

如何通过 USB 发送一个 gcode 命令?

我正在尝试编写一个简单的 python 脚本,将 gcode 命令发送到运行 Marlin 的 wanhao D9 主板打印机。我在通过 USB 连接到打印机的树莓派上运行 python 脚本。

import serial

ser = serial.Serial("/dev/ttyUSB0", 115200)
ser.write("G28\n")
Run Code Online (Sandbox Code Playgroud)

我已经阅读了 20 多个有类似问题的论坛页面,并尝试了他们的答案,例如将波特率更改为 250000 以及对 write 函数参数进行以下更改:

ser.write("G28\r\n")
ser.write(b'G28\r\n')
ser.write(b'G28\n')
ser.write(b'G28')
ser.write("G28")
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有这些组合,并且我还添加了:

time.sleep(5)
Run Code Online (Sandbox Code Playgroud)

以及我文件顶部的时间模块的相关导入语句。我在 ser 声明和 ser.write 函数调用之间添加了这行代码。

我也尝试添加:

ser.close()
Run Code Online (Sandbox Code Playgroud)

看看这是否会有所作为,但事实并非如此,因为我知道这无论如何都是最佳实践。

无论我使用什么代码组合,当我运行我的 python 脚本时,我的打印机似乎重新启动(屏幕从主页变为打开的 wanhao 徽标并返回主页)

我期待任何人都可以就我的代码以及我可能做错的事情向我提供任何帮助。

python pyserial g-code 3d-printing

5
推荐指数
1
解决办法
4719
查看次数