简体   繁体   English

串行 AT 命令在 python 脚本中不起作用,但在 Minicom 中起作用

[英]Serial AT commands not working in python script but working in Minicom

I am trying to program a GPRS/GNSS/... Raspberry PI HAT.我正在尝试对 GPRS/GNSS/... Raspberry PI HAT 进行编程。 Sending commands with Minicom works fine.使用 Minicom 发送命令工作正常。 Sending commands with a Python script works for most of the commands but not for all.使用 Python 脚本发送命令适用于大多数命令,但不适用于所有命令。 Using the Python script commands are received but gives me back errors.收到使用 Python 脚本命令,但返回错误。 I have tried a lot of init sequences, all of those works in Minicom, but not in the Python script.我尝试了很多 init 序列,所有这些都在 Minicom 中有效,但在 Python 脚本中无效。 Once every two executions AT+CSTT="APNNAME" works And AT+CIICR never worked in the script.每两次执行一次 AT+CSTT="APNNAME" 工作并且 AT+CIICR 在脚本中从未工作过。 I have restarted the board, the result is the same.我已经重新启动了电路板,结果是一样的。 The board answer me but with a "+PDP: DEACT" and the "ERROR"董事会回答我,但带有“+ PDP:DEACT”和“错误”

Here is the code:这是代码:

#!/usr/bin/env python 
from serial import *
import time 
import io 
import sys 
import RPi.GPIO as GPIO 

# --- Use GPIO PINs to boot the Board 
def toggle_board_onoff(): 
    GPIO.setmode(GPIO.BCM) 
    GPIO.setup(4,GPIO.OUT)

    GPIO.output(4,GPIO.HIGH)
    GPIO.output(4,GPIO.LOW)
    time.sleep(3)
    GPIO.output(4,GPIO.HIGH)

# --- Send AT command to the board. (sio ~ serial port, cmd=command, wait=time to wait after execution before read the result)
def send_cmd(sio, cmd, wait=0): 
    # - Write section 
    sio.flush()
    sio.write(unicode(cmd)) 
    sio.flush()
    print("CMD-> '" + str(cmd) + "'") 

    # - Wait section 
    if wait > 0:
        print("[ DEBUG ] <" + cmd.rstrip() + "> executed, will wait " + str(wait) + " sec")
        time.sleep(wait) 
        print("[ DEBUG ] Wait for " + str(wait) + " sec [ DONE ]") 

    # - Read section
    ligne = sio.readline() 
    print(ligne) 

    # - Expect 'OK' answer
    while(ligne.rstrip() != "OK"):
        if(ligne.rstrip() == "ERROR"): 
            return -1
            #sys.exit(1) 
        ligne = sio.readline()
        print("[" + ligne + "]")  

    # - Split screen for next AT command
    print("----------------------------------")      


# --- Commands to execute in order to bring the network UP 
def init_gprs_network_short(sio):

    com4=b"AT+CSTT='FREE'\n"
    com5=b'AT+CIICR\n'

    if(send_cmd(sio, com4,3) == -1):
        return -1
    if(send_cmd(sio, com5,3) == -1):
        return -1


# --- Serial communication with the board 
def serial_init(): 
    # - This function might be called in a loop for debug (auto reboot if error on network auth) 
    # -------------- Reboot section --------------- 
    time.sleep(2) 
    print("Board reBoot [ ... ]")
    print("Off...")
    toggle_board_onoff()
    time.sleep(8) 
    print("On...")
    toggle_board_onoff() 
    print("Board reBoot [ OK ]") 
    #print("Board is warming [ ... ]") 
    #time.sleep(5) 
    #print("Board is warming [ OK ]") 
    # ---------------------------------------------
    with Serial(port="/dev/ttyS0", baudrate=115200, timeout=1, writeTimeout=1) as port_serie:
            if port_serie.isOpen():
                sio = io.TextIOWrapper(io.BufferedRWPair(port_serie, port_serie)) 
                # - Let the board show boot msg (SMS ok, Call ok etc) 
                for i in range(0,4):
                    print("Boot msg iter [" + str(i) + "]")  
                    time.sleep(0.5) 
                    ligne = sio.readline() 
                    print(ligne)

                # - Try to bring the network UP...          
                network_active = init_gprs_network_short(sio) 
                if network_active == -1:
                    return network_active  

                #while True:
                #       ligne = sio.readline()
                #       print(ligne == unicode("ligne\n"))  
                #       print(ligne) i
    return -1


def main(): 
    # - Boot the board
    print("Board Boot [ ... ]") 
    toggle_board_onoff() 
    print("Board Boot [ OK ]") 

    board_connected_gprs = serial_init()
    # - While we got errors when trying to bring the network UP...
    while(board_connected_gprs == -1):
        board_connected_gprs = serial_init()

main()  

And here is the execution content:这是执行内容:

Board Boot [ ... ]
serial_at_gprs_2.py:11: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  GPIO.setup(4,GPIO.OUT)
Board Boot [ OK ]
Board reBoot [ ... ]
Off...
On...
Board reBoot [ OK ]
Boot msg iter [0]

Boot msg iter [1]

Boot msg iter [2]

Boot msg iter [3]

CMD-> 'AT+CSTT='FREE'
'
[ DEBUG ] <AT+CSTT='FREE'> executed, will wait 3 sec
[ DEBUG ] Wait for 3 sec [ DONE ]
AT+CSTT='FREE'

[OK
]
----------------------------------
CMD-> 'AT+CIICR
'
[ DEBUG ] <AT+CIICR> executed, will wait 3 sec
[ DEBUG ] Wait for 3 sec [ DONE ]
AT+CIICR

[+PDP: DEACT
]
[
]
[ERROR
]
Board reBoot [ ... ]
Off...

The problem does no seams to come from the board as it works fine in Minicom.问题没有来自电路板的接缝,因为它在 Minicom 中工作正常。 I first thought that it was an encoding problem, but the command is well read as the board answer me...我首先认为这是一个编码问题,但是当董事会回答我时,该命令已被很好地阅读......

Do you have any ideas that could help me with this ?你有什么想法可以帮助我解决这个问题吗? If you need more information about the config or anything else, please tell me.如果您需要有关配置或其他任何内容的更多信息,请告诉我。

Board : https://www.waveshare.com/wiki/GSM/GPRS/GNSS_HAT主板https : //www.waveshare.com/wiki/GSM/GPRS/GNSS_HAT

SIM868_GNSS_Application Note_V1.00 : https://www.waveshare.com/w/upload/3/3d/SIM868_GNSS_Application_Note_V1.00.pdf SIM868_GNSS_Application Note_V1.00 : https://www.waveshare.com/w/upload/3/3d/SIM868_GNSS_Application_Note_V1.00.pdf

Thank you very much !非常感谢 !

  1. use AT+CIPSHUT使用 AT+CIPSHUT
  2. use \\r\\n (CR and LF, you can check the difference here > Difference between CR LF, LF and CR line break types? )使用\\r\\n(CR和LF,你可以在这里查看区别> CR LF、LF和CR换行符类型的区别

These steps below worked for me.下面的这些步骤对我有用。 using on my code (UART connection baudrate=9600)在我的代码上使用(UART 连接波特率 = 9600)

import sys, time
from machine import UART

sim800 = UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9)) ##this pinout for raspberry pi pico

# [...] something about my code that is not the question point 

#try to connect AT+CSTT in APN mode
sim800.write('AT+CSTT="host","username","password"\r\n') ## this is to connect into APN
time.sleep(.5)

if 'ERROR' in str(sim800.read()):
    print('error to connect 1, trying again...')
    sim800.write('AT+CIPSTATUS\r\n') ## this is to check the status, probably it will be 'IP START' or 'PDP: DEAC'
    time.sleep(.5)

    if 'IP INITIAL' not in str(sim800.read()):
        sim800.write('AT+CIPSHUT\r\n') ## after this command the cipstatus will change to IP INITIAL
        time.sleep(.5)

        # now we can connect to apn using AT+CSTT
        sim800.write('AT+CSTT="host","username","password"\r\n')
        time.sleep(.5)

        if 'ERROR' in str(sim800.read()):
            print('error to connect 2. closing')
            sys.exit()

adjusting it to your code, will be like:将其调整为您的代码,将类似于:

[...]
com6 = b'AT+CIPSTATUS\r\n'
com7 = b'AT+CIPSHUT\r\n'

if('IP INITIAL' not in send_cmd(sio, com6,3)):
    send_cmd(sio, com7,3)
[...]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM