串行通信。正确发送DTR吗?
我正在使用一款索尼爱立信的 gm29。
根据说明书,仅仅插上电源是不够的,不能让调制解调器启动。说明书上说:
- 需要激活RS232控制线DTR,保持高电平超过0.2秒。
我正在用Python写一些测试,但:
#!/usr/bin/env python
import serial
from time import sleep
socket = serial.Serial('/dev/ttyS0',
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=1,
xonxoff=0,
rtscts=0
)
socket.setDTR(True)
sleep(3)
socket.setDTR(False)
try:
while True:
socket.write('AT'+chr(13));
sleep(1)
print "Reading"
print socket.readlines()
except:
socket.close()
这并不奏效……有没有其他方法可以让DTR变高呢?比如用minicom或者其他工具?或者说,我是不是漏掉了什么?
提前谢谢你。
好吧,这让我很抓狂。关键是电源适配器“坏了”,或者说,用测试仪测试时它工作得很好,但插到调制解调器上时,有些线会移动,导致没有电压通过……
不过还是谢谢你的回答,我标记为正确,因为确实是这样 :D
1 个回答
4
这里有几个我想到的事情。
1) 说明书上说 DTR 是低电平有效的,所以你可能需要把 true
和 false
的值调换一下,传给 setDTR()
,这要看是谁搞混了。
2) 你在唤醒调制解调器后把 DTR
设置为 false。这会告诉调制解调器下线,并且在它再次变为 true
之前,忽略所有输入。你可以试试下面的代码:
import serial
from time import sleep
conn = serial.Serial('/dev/ttyS0',
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=1,
xonxoff=0,
rtscts=0
)
# Wake Modem
conn.setDTR(True)
sleep(3)
conn.setDTR(False)
sleep(5)
# Start talking
conn.setDTR(True)
try:
while True:
conn.write('AT'+chr(13));
print conn.readline() # readlines() will probably never return.
finally:
conn.close()
3) socket
这个名字可能不太适合你的串口连接。