我处于一个不幸的位置,我已经交付了一个传统的系统,火线相机连接到旧的Windows XP机器.基本上我正试图将这一切都变成opencv所以我至少可以在这台旧机器上有一个很好的界面.
问题是,我似乎无法找到有关如何连接到python端的firewire端口的任何文档.是否有一些扩展pyserial可能让我连接到这台古老的机器?
对不起,我不能更明确,但我真的没有找到太多关于此.如果有任何方式我可以提供更多帮助,请告诉我,我会尽快提供任何信息.
我编写了下面的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)
如上所述,我没有收到任何信息 …
我正在研究一个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 …
我试过谷歌搜索,找不到答案,在这里搜索,找不到答案.有没有人研究从线程a写入Serial()对象(pyserial)是否是线程安全并从线程b执行阻塞读取?
我知道如何使用线程同步原语和线程安全的数据结构,事实上我这个程序的当前形式有一个专用于读取/写入串口的线程,我使用线程安全的数据结构来协调应用程序中的活动.
如果我可以从主线程写入串口(并且从不读取它),我的应用程序将受益匪浅,并使用第二个线程中的阻塞读取从串行端口读取(并且永远不会写入它).如果有人真的希望我进入为什么这会使应用程序受益,我可以添加我的理由.在我看来,只有一个Serial()实例,即使线程B位于Serial对象的阻塞读取中,线程A也可以安全地在Serial对象上使用write方法.
有人知道Serial类是否可以这样使用?
编辑:我觉得答案可能是平台依赖的.如果您对此类平台有任何经验,最好知道您正在使用哪个平台.
编辑:只有一个回复,但如果有其他人尝试过此,请留下您的经验回复.
我正在尝试使用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) )当我离开串行模式时,芯片可以正常编程.
我正在尝试使用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) 我试图在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.
从终端执行以下操作时,它可以工作:
$ 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) 动机
我想开始学习如何使用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 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) pyserial ×10
python ×9
serial-port ×5
arduino ×3
arduino-uno ×1
async-await ×1
at-command ×1
firewire ×1
gsm ×1
linux-mint ×1
module ×1
python-2.7 ×1
python-3.5 ×1
python-3.x ×1
socat ×1
websocket ×1
windows ×1