串行通信。正确发送DTR吗?

0 投票
1 回答
8142 浏览
提问于 2025-04-15 19:52

我正在使用一款索尼爱立信的 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 是低电平有效的,所以你可能需要把 truefalse 的值调换一下,传给 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 这个名字可能不太适合你的串口连接。

撰写回答