标签: pyserial

如何从串口读取数据?Python

你好,请忍受我的基本问题,因为我是 python 新手。
我正在尝试从串行端口读取数据。基本上,串行端口是USB端口虚拟地转换为串行端口。我正在使用阿杜伊诺。
首先我尝试了这段代码:

while(True):
    ser=serial.Serial('COM6',9600)
    bytoread=ser.inWaiting()
    val=ser.read(bytoread)
Run Code Online (Sandbox Code Playgroud)

但这给了我错误。

Permission Error(13,Access is denied, none 5)
Run Code Online (Sandbox Code Playgroud)

但是当我将代码更改为

while(True):
    ser=serial.Serial()
    ser.baudrate=19600
    ser.port='COM6'
    ser
    ser.open()
    bytoread=ser.inWaiting()
    val=ser.read(bytoread)
Run Code Online (Sandbox Code Playgroud)

权限错误没有出现,但程序总是忙于连接端口。我等了很多分钟,但它一直没有进展。我在这里做错了什么?

python serial-port arduino pyserial

4
推荐指数
1
解决办法
3862
查看次数

使用 pySerial 在 Python 下重新连接到 USB 端口时,如何避免在 ttyUSB0 和 ttyUSB1 之间翻转?

我有一个串行 Python 程序,Linux 环境(Raspbian / Raspberry Pi),它通过 USB 到串行适配器使用串行端口。我需要处理用户拔下 USB 适配器然后重新插入的情况。

问题是,重新连接时,ttyUSB0变为ttyUSB1,因此不再找到该端口。但是,如果我停止 Python 程序(键盘中断)并再次拔下并重新插入 USB 适配器,则端口会返回到ttyUSB0(这样我就可以重新开始)。这只会在 Python 程序停止时发生。

我在触发器模式下测试了该程序(它似乎正在工作)以便在不再找到ttyUSB0时使用ttyUSB1,反之亦然,如果不再找到ttyUSB1,请使用ttyUSB0,等等,但是这个对我来说似乎是一个奇怪的解决方案。

有没有更好的方法来强制 pySerial “忘记”它曾经连接到 ttyUSB0 以防出错,并在程序仍在运行时将当前端口释放到系统?

这是一个有效的触发器测试程序:

import serial
import time

p = "/dev/ttyUSB0"

while True:
    error_flag = False
    try:
        s = serial.Serial(port=p, baudrate=9600, bytesize=8, parity="N", stopbits=1, timeout=None, xonxoff=False, rtscts=False, write_timeout=None, dsrdtr=False, inter_byte_timeout=None)
    except Exception as e:
        error_flag = True
        if "ttyUSB0" in str(e):
            p = "/dev/ttyUSB1"
            print …
Run Code Online (Sandbox Code Playgroud)

python pyserial raspberry-pi raspbian

4
推荐指数
1
解决办法
3756
查看次数

Pyserial:“模块‘serial’没有‘tools’属性”

我有一些设备通过RS485 到 USB 转换器连接到我的笔记本电脑,并希望在 python 程序中检测它们。

我在Windows 7 Notebook 上使用PyCharm Community Edition运行此代码,我已经使用 pip 安装了 pyserial。

导入序列

x = list(serial.tools.list_ports.comports())
print(x)
Run Code Online (Sandbox Code Playgroud)

并得到这个错误:

回溯(最近一次调用):文件“C:/Users/rzzrgx/.PyCharmCE2018.3/config/scratches/scratch_1.py”,第 3 行,在 x = list(serial.tools.list_ports.comports()) AttributeError :模块“串行”没有属性“工具”

python pyserial python-3.x

4
推荐指数
1
解决办法
6233
查看次数

如何在 Python 3.7 中向 bytearray 添加字节?

我是 Python 3.7 的新手,我正在尝试使用以下代码从串行端口读取字节。我正在使用pySerial模块并且read()函数返回bytes.

self.uart = serial.Serial()
self.uart.port = '/dev/tty/USB0'
self.uart.baudrate = 115200
self.uart.open()
# buffer for received bytes
packet_bytes = bytearray()
# read and process data from serial port
while True:
    # read single byte from serial port
    current_bytes = self._uart.read()
    if current_bytes is B'$':
        self.process_packet(packet_bytes)
        packet_bytes = bytearray()
    else:
        packet_bytes.append(current_bytes)        <- Error occurs here
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

类型错误:需要一个整数

一些想法如何解决?

python arrays pyserial python-3.x

4
推荐指数
1
解决办法
8528
查看次数

Pyserial 我什么时候应该使用flush?

我正在使用 pyserial 并尝试在 arduino 板上写入和读取数据。我看到几个例子表明在读写时应该使用flush。即使阅读了 pyserial 文档后,我也无法理解flush的作用是什么。我还注意到有:

flushInput()
flushOutput()
flush()
Run Code Online (Sandbox Code Playgroud)

每一个的作用是什么,为什么以及何时应该使用它。我很感激你的解释。

python serial-port pyserial python-3.x

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

如何在Python中从整数创建字节值?

背景:我需要将一个数值作为字节发送到外部设备,但我遇到了一个问题.我的代码是:

ser=serial.Serial("COM3",9600, timeout=0)
ser.write(value)
Run Code Online (Sandbox Code Playgroud)

其中"value"是我读过的int读过的.问题是,当我发送它时,它发送字符值,而不是实际值(它发送数字5的字节值31,因为这是它的unicode位置,我相信)

实际上,我希望能够以"\ x05"字符发送它.我想我的问题是,我将如何将int 5转换为char"\ x05",或将37转换为"\ x37"

python serial-port arduino pyserial

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

未定义的变量:SerialException

我正在使用pySerial库从Arduino获取Python脚本日志数据.我正在尝试处理SerialException,当脚本无法连接到您提供的端口时,Eclipse会说"Undefined variable:SerialException".有什么我忘了导入的东西吗?

码:

try:
    ser = serial.Serial(port, 9600)
    connected = 1
except SerialException:
    print "No connection to the device could be established"
Run Code Online (Sandbox Code Playgroud)

python exception-handling serial-port exception pyserial

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

pySerial程序无法正确读取串行

我使用pySerial有问题,我不知道从哪里开始寻找.我有一个64位Windows 7操作系统,Python 2.7.5(32位),pySerial和Arduino(Arduino正常工作)已经安装.

我的Arduino代码如下:

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the serial in 19200 baud rate
  Serial.begin(19200);     
}

// the loop routine runs over and over again forever:
void loop() {
  delay(1000);               // wait for a second
  Serial.print("hello");
}
Run Code Online (Sandbox Code Playgroud)

(Arduino在COM8中连接,使用串行监视器时我可以看到它敬礼)

我的PySerial代码如下所示:

import serial
import time

arduino = serial.Serial("COM8", 19200)
time.sleep(2)  

while True:
    print arduino.readline()
Run Code Online (Sandbox Code Playgroud)

当我启动这个脚本时,程序运行,但我看不到串行输出(我认为Python脚本中的配置是正常的,因为如果有什么东西 - 例如端口 - 是错误的,它会崩溃).

我不知道如何找到解决方案.你能帮助我吗?

python windows serial-port arduino pyserial

3
推荐指数
1
解决办法
4953
查看次数

PySerial丢失数据

我的问题是,PySerial似乎丢失了一些数据包,我不知道为什么.

我有两个python脚本,第一个从文本文件中读取数据并将其写入微控制器,在那里操作数据.然后,微控制器通过不同的串行端口将修改后的数据发送回PC.(澄清一下:我需要两个串口,因为在最终的应用程序中,脚本将在不同的PC上运行.但是,出于测试目的,在一台PC上运行这两个脚本更容易)

所以基本上,我的硬件设置如下:

PC ----(serial port 1)----> microcontroller
   <---(serial port 2)----- 
Run Code Online (Sandbox Code Playgroud)

在将数据写入微控制器后,我希望能够获得一定数量的数据字节.如果我使用终端程序(如HyperTerminal)来监控收到的数据,一切看起来都很好.但是,如果我尝试使用Python脚本读取数据,我只获得预期数据字节的一小部分.

例如:

+--------------------+--------------------+
| with HyperTerminal | with Python script |
+--------------------+--------------------+
| 1:W:00522          | 1:W:00522          |
| 1:W:00532          | 1:W:00532          |
| 1:W:00518          | 1:W:00522          |
| 1:W:00522          | 1:W:00526          |
| 1:W:00522          | 1:W:00514          |
| 1:W:00526          | 1:W:00520          |
| 1:W:00514          | 1:W:00514          |
| 1:W:00520          | 1:W:00522          |
| 1:W:00520          | 1:W:00526          |
| 1:W:00514          | 1:W:00520          |
| 1:W:00516          | 1:W:00526          |
| 1:W:00522 …
Run Code Online (Sandbox Code Playgroud)

python multithreading loss pyserial

3
推荐指数
1
解决办法
7153
查看次数

Python串口侦听器

我已经开始使用PySerial编写一些代码来向串行设备发送和接收数据.

到目前为止,我一直致力于从终端启动事务并从串行设备接收响应.

伪:

main:
    loop:
        message = get_message()
        send_to_serial(message)
        time_delay(1 second)
        read_response()
Run Code Online (Sandbox Code Playgroud)

现在我想在串口设备启动通信的情况下在该端口上实现一个监听器.另外要移除time_delay哪个可能会结束太长时间,或者不足以让串行设备响应.

state = idle
register_interrupt(serial_device, read_response())

main:
    loop:
        message = get_message()
        state = sending
        send_to_serial(message)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我还没有找到任何使用中断进行通信的PySerial代码.

我只是不知道如何在python中设置任何类型的中断,怎么会

python serial-port interrupt pyserial

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