标签: pyserial

在python中与Firewire端口通信

我处于一个不幸的位置,我已经交付了一个传统的系统,火线相机连接到旧的Windows XP机器.基本上我正试图将这一切都变成opencv所以我至少可以在这台旧机器上有一个很好的界面.

问题是,我似乎无法找到有关如何连接到python端的firewire端口的任何文档.是否有一些扩展pyserial可能让我连接到这台古老的机器?

对不起,我不能更明确,但我真的没有找到太多关于此.如果有任何方式我可以提供更多帮助,请告诉我,我会尽快提供任何信息.

python windows firewire pyserial

10
推荐指数
1
解决办法
835
查看次数

如何在活动呼叫期间通过GSM调制解调器发送和接收一些数据(Python和AT命令)

我编写了下面的Python程序来与我的D-Link DWM-156 GSM调制解调器进行通信.该程序等待来电,当收到RING警报时,它接受该呼叫.

幸运的是它工作正常;)

该程序:

import time
import serial

phone = serial.Serial("COM10",  115200, timeout=5)

try:
    time.sleep(1)
    while(1):
        x = phone.readline()
        print(x)
        if (x == b'RING\r\n'):
            phone.write(b'ATA\r')
            time.sleep(0.5)

finally:
    phone.close()
Run Code Online (Sandbox Code Playgroud)

运行期间的输出:

>>> ================================ RESTART ================================
>>> 
b''
b''
b''
b'\r\n'
b'RING\r\n'   #Here, my friend (named "Jimmy",for example), called me.
b'OK\r\n'
b''
b''
b''
b''
b''
Run Code Online (Sandbox Code Playgroud)

如上所示,在接到来电后,GSM调制解调器立即接受它,从那一点到最后,我们有一个有效的呼叫.

我的问题:

1-在此活动呼叫期间是否可以发送/接收某些数据(例如SMS)?或者至少可以在这个有效通话期间在这个频道的另一侧(即吉米手机的扬声器)发出噪音吗?(我不想发出可识别的声音,噪音就足够了.虽然有一种发送可识别语音的方法确实更好.)

2-为什么此程序检测到来电,但未检测到来电短信?往下看.当Jimmy向我的GSM调制解调器发送3条短信时,你可以看到我程序的输出(并且他在我的手机上收到了所有这些的"已发送"通知).

>>> ================================ RESTART ================================
>>> 
b''
b''
b''
b''
b''
b''
b''
Run Code Online (Sandbox Code Playgroud)

如上所述,我没有收到任何信息 …

python gsm pyserial at-command python-3.x

10
推荐指数
1
解决办法
2444
查看次数

Python串口通讯

我正在研究一个Arduino项目,由于内存限制,我正在将它与Python脚本连接起来.在Python方面,我有一个2维矩阵,包含坐标的各个x,y值,在这个列表中是26000个坐标对.因此,为了澄清所有人的数据结构pathlist[0][0],将返回列表的第一个坐标的X值.在Python中对此列表执行不同的操作等没有任何问题.然而,我遇到麻烦的是将这些值通过串行发送到Arduino,这是有用的.

由于串行通信的性质(至少我认为是这种情况),我必须将每个整数作为一个字符串发送,一次只发送一个数字.因此,像345这样的数字将作为3个单独的字符发送,当然,这些字符是3,4,然后是5.

我正在努力寻找一种方法来重建Arduino上的整数.

每当我发送一个值时,它就会接收数据并输出它,如下所示:

  //Python is sending over the number '25'
  2ÿÿ52
  //Python is sending the number 431.
  4ÿÿ321ÿÿÿ2
Run Code Online (Sandbox Code Playgroud)

Arduino代码是:

String str;
int ds = 4;

void setup() {
    Serial.begin(9600);
}

void loop(){
    if (Serial.available()>0) {
        for (int i=0; i<4; i=i+1) {
            char d= Serial.read();
            str.concat(d);
        }

        char t[str.length()+1];
        str.toCharArray(t, (sizeof(t)));
        int intdata = atoi(t);
        Serial.print(intdata);
    }
}
Run Code Online (Sandbox Code Playgroud)

Python代码如下所示:

 import serial

 s = serial.Serial(port='/dev/tty.usbmodemfd131', baudrate=9600)

 s.write(str(25))
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定问题不是源于输出方法(Serial.print),当我声明另一个int时,它在输出上格式正常,所以我假设问题在于如何intdata构造变量.

值得注意的一两件事,可能有助于诊断这个问题是,如果我改变Serial.print(intdata)Serial.print(intdata+5)我的结果是2ÿÿ57,在这里我希望30(25 …

python serial-port arduino pyserial

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

pyserial - 可以从线程a写入串口,从线程b做阻塞读取吗?

我试过谷歌搜索,找不到答案,在这里搜索,找不到答案.有没有人研究从线程a写入Serial()对象(pyserial)是否是线程安全并从线程b执行阻塞读取?

我知道如何使用线程同步原语和线程安全的数据结构,事实上我这个程序的当前形式有一个专用于读取/写入串口的线程,我使用线程安全的数据结构来协调应用程序中的活动.

如果我可以从主线程写入串口(并且从不读取它),我的应用程序将受益匪浅,并使用第二个线程中的阻塞读取从串行端口读取(并且永远不会写入它).如果有人真的希望我进入为什么这会使应用程序受益,我可以添加我的理由.在我看来,只有一个Serial()实例,即使线程B位于Serial对象的阻塞读取中,线程A也可以安全地在Serial对象上使用write方法.

有人知道Serial类是否可以这样使用?

编辑:我觉得答案可能是平台依赖的.如果您对此类平台有任何经验,最好知道您正在使用哪个平台.

编辑:只有一个回复,但如果有其他人尝试过此,请留下您的经验回复.

python serial-port pyserial

9
推荐指数
1
解决办法
8288
查看次数

从代码中禁用pyserial中的DTR

我正在尝试使用pyserial将数据发送到arduino.但是当我打开COM端口时,它将DTR设置为低电平并重置电路板.但是,我有我的arduino代码设置,因此我必须通过按住两个按钮1秒钟将其置于串行接收模式.如果可能的话,我宁愿不必在arduino的启动时进行串行输入.

显然你可以修改serialWin32.py文件,改变读取的行:

self._dtrState = win32.DTR_CONTROL_ENABLE
Run Code Online (Sandbox Code Playgroud)

至:

self._dtrState = win32.DTR_CONTROL_DISABLE
Run Code Online (Sandbox Code Playgroud)

但是,有没有办法直接在我的python脚本中禁用它?我还需要为所有系统执行此操作.我宁愿不强迫人们改变他们的基本串行配置只是为了使用这个脚本.

串口打开如下:

 com = serial.Serial(port, baud, timeout=1);
Run Code Online (Sandbox Code Playgroud)

更新:最后我找到了一个适合我的设置的解决方案.由于我不需要一直使用串行数据,只有当我将设备置于串行接收模式时,才发现了一种方法来禁用arduino本身的串行连接复位.

很多帖子都说你可以通过在5V和复位之间放置一个~100欧姆的电阻来禁用DTR复位.但我不希望这是永久性的事情.所以,我在PD5和复位之间放置了一个电阻器.然后,在软件中:

void setup() {
    //.......
    DDRD &= ~(_BV(PD5)); //Set PD5 as input initially
    PORTD |= (_BV(PD5)); //Set high
    //.......
}

inline void setResetDisable(bool state)
{
  if(state)
    DDRD |= (_BV(PD5)); //Set PD5 as output to put 5V on reset line
  else
    DDRD &= ~(_BV(PD5)); //set back to input mode
}
Run Code Online (Sandbox Code Playgroud)

所以现在,当我想要处于串行模式时,我调用setResetDisable(true),它在该100欧姆电阻和复位引脚上抛出5V,防止DTR将其拉低并重置芯片:)然后我只调用setResetDisable(false) )当我离开串行模式时,芯片可以正常编程.

python serial-port arduino pyserial

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

串口导入python

我正在尝试使用pyserial.当我执行以下脚本时.

import serial
ser= serial.serial("COM5", 9600)
ser.write("Hello worldn")
x = ser.readline()
print(x)     
Run Code Online (Sandbox Code Playgroud)

错误代码:

c:\Python27>python com.py
Traceback (most recent call last):
  File "com.py", line 2, in <module>
    ser= serial.serial("COM5", 9600)
AttributeError: 'module' object has no attribute 'serial'
Run Code Online (Sandbox Code Playgroud)

我读了一个建议,并改为:

from serial import serial
ser= serial.serial("COM5", 9600)
ser.write("Hello worldn
x = ser.readline()
print(x)     
Run Code Online (Sandbox Code Playgroud)

我现在得到错误

c:\Python27>python com.py
Traceback (most recent call last):
  File "com.py", line 1, in <module>
    from serial import serial
ImportError: cannot import name serial
Run Code Online (Sandbox Code Playgroud)

我读到这可能来自你的模块中的ini,但不知道任何关于这一点.

我打印了我的sys.path和pyserial在那里.

['C:\\Users\\Jeff\\Desktop', 'C:\\Python27\\lib\\site-packages\\distribute-0.6.4
9-py2.7.egg', …
Run Code Online (Sandbox Code Playgroud)

python serial-port module pyserial

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

等待使用pySerial进行Arduino自动重置

我试图在Linux上用一个非常简单的代码(为了展示问题)从Arduino板读取行.

Python代码:

# arduino.py
import serial
arduino = serial.Serial('/dev/ttyACM0')

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

Arduino代码:

// simpleWrite.ino
long ii = 0;

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
}

void loop() {
  Serial.println(ii);
  ii++;
}
Run Code Online (Sandbox Code Playgroud)

由于电路板在打开串行连接时自动复位,因此第一个字节可能是垃圾.一两秒后一切正常.

这是典型的输出:

$ python arduino.py 
b'09\r\n'
b'540\r\n'
b'541\r\n'
b'542\r\n'
b'543\r\n'
b'544\r\n'
b'545\r\n'
b'546\r\n'
b'547\r\n'
b'548\r\n'
b'549\r\n'
b'550\r\n'
b'551\r\n'
b'552\r\n'
b'553\r\n'
b'554\r\n'
b'555\r\n'
b'556\r\n'
b'557\r\n'
b'55\xfe0\r\n'  # <---- Here the board restarted
b'1\r\n'
b'2\r\n'
b'3\r\n'
b'4\r\n'
b'5\r\n'
b'6\r\n'
b'7\r\n'
b'8\r\n'
b'9\r\n'
b'10\r\n' …
Run Code Online (Sandbox Code Playgroud)

python arduino pyserial

9
推荐指数
1
解决办法
8449
查看次数

OSError:[Errno 13]权限被拒绝:'/ dev/ttyACM0' - 使用pyserial从Python到Arduino

环境

  • Linux Mint 17.1
  • Python 2.7
  • pyserial 2.7
  • Arduino UNO rv3

期望的行为

我正在尝试将三个值从Python应用程序发送到Arduino.

从终端执行以下操作时,它可以工作:

$ python
$ import serial
$ import struct
$ ser = serial.Serial('/dev/ttyACM0', 9600)
$ ser.write(struct.pack('>3B', 255, 0, 0))
Run Code Online (Sandbox Code Playgroud)

当前行为

在Python文件中使用相同的代码时它不起作用,即:

import serial
import struct
ser = serial.Serial('/dev/ttyACM0', 9600)
ser.write(struct.pack('>3B', red_value, green_value, blue_value))
Run Code Online (Sandbox Code Playgroud)

错误信息

$ sudo tail -100 /var/log/apache2/error.log
OSError: [Errno 13] Permission denied: '/dev/ttyACM0'
Run Code Online (Sandbox Code Playgroud)

故障排除

权限

申请文件:

$ ls -l
-rwxr-xr-x 1 myname mygroupname 114146 Jan  9 19:16 my_application.py
Run Code Online (Sandbox Code Playgroud)

ttyACM0:

ls -l /dev/ttyACM0
crw-rw---- 1 root …
Run Code Online (Sandbox Code Playgroud)

pyserial linux-mint python-2.7 arduino-uno

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

Pyserial与虚拟端口不兼容

动机

我想开始学习如何使用python库pyserial.它似乎是一个非常好的图书馆,适用于很多人.我想将它用于即将开展的项目,我必须自动进行串行通信.

环境

我正在运行Ubuntu 15.04.我正在使用Python 2.7.

设置虚拟端口

我目前没有可以通过串口与之通信的设备.我正在使用socat应用程序创建两个相互连接的虚拟端口,波特率为9600.

$ socat -d -d pty,raw,echo=0,b9600 pty,raw,echo=0,b9600
2016/01/16 12:57:51 socat[18255] N PTY is /dev/pts/2
2016/01/16 12:57:51 socat[18255] N PTY is /dev/pts/4
2016/01/16 12:57:51 socat[18255] N starting data transfer loop with FDs [5,5] and [7,7]
$ echo "hello" > /dev/pts/2
$ cat /dev/pts/4
hello
Run Code Online (Sandbox Code Playgroud)

大!好像港口有效!

一个简单的pyserial脚本

我使用pip安装pyserial

$ sudo pip install pyserial
Run Code Online (Sandbox Code Playgroud)

然后我写了一个小的serialtest.py

#!/usr/bin/env python
import serial

ser = serial.Serial('/dev/pts/2', 9600)
Run Code Online (Sandbox Code Playgroud)

这是serialtest.py的全部内容

运行脚本并遇到错误

$ python serialtest.py 
Traceback (most recent call …
Run Code Online (Sandbox Code Playgroud)

python serial-port virtual-serial-port pyserial socat

9
推荐指数
1
解决办法
6267
查看次数

如何使python等待对象

python 3.5.1中,可以使用await/async,但是,要使用它(因为我不支持),你需要有一个等待对象.等待对象是一个定义__await__()返回迭代器的方法的对象.更多信息在这里.但我不能谷歌任何有这个的例子,因为大多数例子都有某种asyncio.sleep(x)来模仿等待对象.

我的最终目标是制作简单的websocket串口服务器,但是,我无法通过这第一步.这是我的(非工作代码).

import serial
import asyncio

connected = False
port = 'COM9'
#port = '/dev/ttyAMA0'
baud = 57600
timeout=1

class startser(object):

    def __init__(self, port, baud):
        self.port = port
        self.baud = baud       

    def openconn(self):       
        self.ser = serial.Serial(port, baud)

    async def readport(self):
        #gooo= await (self.ser.in_waiting > 0)
        read_byte = async self.ser.read(1).decode('ascii')        
        self.handle_data(read_byte)
        print ("42")  

    def handle_data(self, data):
        print(data)

serr=startser(port,baud)
serr.openconn()

loop = asyncio.get_event_loop()
#loop.run_forever(serr.readport())
loop.run_until_complete(serr.readport())
loop.close()

print ("finitto")

#with serial.Serial('COM9', 115200, timeout=1) as …
Run Code Online (Sandbox Code Playgroud)

python pyserial websocket async-await python-3.5

9
推荐指数
1
解决办法
4559
查看次数