Serial port 从串行端口进行写入和读取

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: 日志: 迷你

我使用以下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:
日志:

迷你通信控制台

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键的击键放入发送的字符串中,因为它不是自动发送的。所以,可能需要确保