Serial port 从串行端口进行写入和读取
我使用以下python脚本在串行端口ttyUSB1上编写AT+CSQ。 但是我什么都看不懂 但是,当我在minicom上对+CSQ进行激发时,我得到了所需的结果 这个脚本可能有什么问题 日志: 手稿Serial port 从串行端口进行写入和读取,serial-port,usb,pyserial,at-command,Serial Port,Usb,Pyserial,At Command,我使用以下python脚本在串行端口ttyUSB1上编写AT+CSQ。 但是我什么都看不懂 但是,当我在minicom上对+CSQ进行激发时,我得到了所需的结果 这个脚本可能有什么问题 日志: 手稿 root@imx6slzbha:~# python se.py Serial is open Serial is open in try block also write data: AT+CSQ read data: read data: read data: read data: 日志: 迷你
root@imx6slzbha:~# python se.py
Serial is open
Serial is open in try block also
write data: AT+CSQ
read data:
read data:
read data:
read data:
日志:
迷你通信控制台
1. ate
OK
2. at+csq
+CSQ: 20,99
3. at+csq=?
OKSQ: (0-31,99),(99)
如何在下面的python脚本中接收这些结果
import serial, time
#initialization and open the port
#possible timeout values:
# 1. None: wait forever, block call
# 2. 0: non-blocking mode, return immediately
# 3. x, x is bigger than 0, float allowed, timeout block call
ser = serial.Serial()
ser.port = "/dev/ttyUSB1"
ser.baudrate = 115200
ser.bytesize = serial.EIGHTBITS #number of bits per bytes
ser.parity = serial.PARITY_NONE #set parity check: no parity
ser.stopbits = serial.STOPBITS_ONE #number of stop bits
ser.timeout = None #block read
#ser.timeout = 0 #non-block read
ser.timeout = 3 #timeout block read
ser.xonxoff = False #disable software flow control
ser.rtscts = False #disable hardware (RTS/CTS) flow control
ser.dsrdtr = False #disable hardware (DSR/DTR) flow control
ser.writeTimeout = 2 #timeout for write
try:
ser.open()
print("Serial is open")
except Exception, e:
print "error open serial port: " + str(e)
exit()
if ser.isOpen():
try:
print("Serial is open in try block also")
ser.flushInput() #flush input buffer, discarding all its contents
ser.flushOutput()#flush output buffer, aborting current output
#and discard all that is in buffer
#write data
ser.write("AT+CSQ")
time.sleep(1)
# ser.write("AT+CSQ=?x0D")
print("write data: AT+CSQ")
# print("write data: AT+CSQ=?x0D")
time.sleep(2) #give the serial port sometime to receive the data
numOfLines = 1
while True:
response = ser.readline()
print("read data: " + response)
numOfLines = numOfLines + 1
if (numOfLines >= 5):
break
ser.close()
except Exception, e1:
print "error communicating...: " + str(e1)
else:
print "cannot open serial port "
您在AT命令处理方面有两个非常根本的缺陷:
time.sleep(1)
及
他们有多糟糕?在你解决这些问题之前,任何事情都不会起作用,我的意思是完全改变你发送和接收命令和响应的方式
向调制解调器发送AT命令是一种与任何其他协议一样的通信协议,其中某些部分和行为是必需的,而不是可选的。正如您不会编写完全忽略从HTTP服务器返回的响应的HTTP客户机一样,您决不能编写向调制解调器发送AT命令并完全忽略调制解调器返回的响应的程序
AT命令是一种链路层协议,窗口大小为1-1。因此,在发送命令行之后,发送方必须等到收到来自调制解调器的响应后,才能完成对命令行的处理,这种响应称为最终结果代码
如果调制解调器在响应最终结果代码之前使用了70毫秒,则必须等待至少70毫秒才能继续;如果调制解调器使用4秒,则必须等待至少4秒才能继续;如果调制解调器使用了几分钟(是的,存在可能需要几分钟才能完成的at命令),则必须等待几分钟。如果调制解调器在一小时内没有响应,您唯一的选择是1)继续等待,2)放弃或3)断开连接,重新连接,然后重新启动
这就是为什么睡眠
是一种可怕的方法,在最好的情况下是一个浪费时间的定时炸弹。这就像踢挡你路的狗一样有用,可以让它们移动。是的,它可能在某些时候确实有效,但在某些时候,你会因为采用这种方法而感到抱歉
关于numOfLines
,任何人都无法事先知道调制解调器将响应多少行。如果您的调制解调器只响应一行错误
最终结果代码,该怎么办?代码将死锁
因此,行号计数必须完全消失,相反,您的代码应该发送一个命令行,然后通过调制解调器的响应行等待最终结果代码
但在深入探讨这个答案之前,先阅读说明书,至少是第5章的全部内容。这是定义AT命令基础知识的标准,例如,它将教您命令和命令行之间的区别。以及如何在您没有执行的命令行中执行,以便调制解调器永远不会开始处理您发送的命令。您的AT命令处理有两个非常基本的缺陷:
time.sleep(1)
及
他们有多糟糕?在你解决这些问题之前,任何事情都不会起作用,我的意思是完全改变你发送和接收命令和响应的方式
向调制解调器发送AT命令是一种与任何其他协议一样的通信协议,其中某些部分和行为是必需的,而不是可选的。正如您不会编写完全忽略从HTTP服务器返回的响应的HTTP客户机一样,您决不能编写向调制解调器发送AT命令并完全忽略调制解调器返回的响应的程序
AT命令是一种链路层协议,窗口大小为1-1。因此,在发送命令行之后,发送方必须等到收到来自调制解调器的响应后,才能完成对命令行的处理,这种响应称为最终结果代码
如果调制解调器在响应最终结果代码之前使用了70毫秒,则必须等待至少70毫秒才能继续;如果调制解调器使用4秒,则必须等待至少4秒才能继续;如果调制解调器使用了几分钟(是的,存在可能需要几分钟才能完成的at命令),则必须等待几分钟。如果调制解调器在一小时内没有响应,您唯一的选择是1)继续等待,2)放弃或3)断开连接,重新连接,然后重新启动
这就是为什么睡眠
是一种可怕的方法,在最好的情况下是一个浪费时间的定时炸弹。这就像踢挡你路的狗一样有用,可以让它们移动。是的,它可能在某些时候确实有效,但在某些时候,你会因为采用这种方法而感到抱歉
关于numOfLines
,任何人都无法事先知道调制解调器将响应多少行。如果您的调制解调器只响应一行错误
最终结果代码,该怎么办?代码将死锁
因此,行号计数必须完全消失,相反,您的代码应该发送一个命令行,然后通过调制解调器的响应行等待最终结果代码
但在深入探讨这个答案之前,先阅读说明书,至少是第5章的全部内容。这是定义AT命令基础知识的标准,例如,它将教您命令和命令行之间的区别。以及如何删除您未执行的命令行,以便调制解调器永远不会开始处理您发送的命令。1。在minicom上,您似乎是第一次发送ate,但没有看到您在格式糟糕的Python代码中发送ate。2.在minicom中发送字符串时,还可以按enter键,该键也会以“\r”或“\n”的形式发送(不确定是哪一个,可能无关紧要),在python中发送字符串时,必须显式地将enter键的击键放入发送的字符串中,因为它不是自动发送的。所以,可能需要确保