Terminal

將執行終端輸出保存為變數

  • April 12, 2022

我正在執行一個使用pyserial包的 python 腳本。我使用一塊板來控制電機旋轉,並通過 USB 埠連接。

該板已經程式,可以使用給定的命令旋轉電機。下面是一些例子:

  1. 輸入:檢查電機狀態的命令:H010100

輸出 :

{
.."beambreak": [0,0,0,0,0],
.."prox": [0.003,0.003],
.."T1": [0,0],
.."T2": [0,0],
.."MT": [-1,-1]
.."test_switch": 0,
.}
  1. 輸入:指令旋轉電機一次:H010101

輸出:{“旋轉”:“成功”}

任務:在’while’循環中,如何每1分鐘發送一次命令(例如H010101),檢查輸出消息(例如{“Rotate”:“Successful”})並根據輸出消息條件發送下一個命令。

問題:當我執行程式碼時,“可以設置”輸出消息出現在 linux 終端/IDE 控制台中,但我不知道將消息保存為變數並將其應用於循環條件。我的意思是,要檢查消息是否是相同的消息,等待 1 分鐘並再次發送 H010101 命令?

我也嘗試將文件保存在 *.log 或 *.txt 但沒有工作範例:

$ python test.py >> *.txt    
$ python test.py > *.log

這是我的程式碼:

import time
import serial


# configure the serial connections 
ser = serial.Serial(
   port='/dev/ttyUSB0',
   baudrate=115200,
   parity=serial.PARITY_NONE,
   stopbits=serial.STOPBITS_ONE,
   bytesize=serial.EIGHTBITS
)


while True :
   print(' Check Status')
   ser.write('H010000\n'.encode())
   status_cmd = ser.readline()
   print(status_cmd)
   
   if status_cmd === "test_switch: 0 " : #  i can't save the message as variable from  running terminal 
       time.sleep(5)
     
   # Command to rotate motor
   ser.write('H010101\n'.encode())
   # read respond of give command
   reading = ser.readline()
   print(reading)    
   
   if reading == {"Drop":"Successful"} :   # i can't save the message as variable from  running terminal 
       time.sleep(60)
       # rotate motor 
       ser.write('H010101\n'.encode())
       # read respond of give command
       reading = ser.readline()
       print(reading)

您可以做的第一件事是將函式封裝到方法中(如果您願意,也可以使用類)

檢查狀態

def check_status(ser):
   print('Check Status')
   ser.write('H010000\n'.encode())
   current_status = ser.readline().decode('utf-8')
   return current_status

旋轉電機

def rotate_motor(ser):
   print('Rotating ..')
   ser.write('H010101\n'.encode())
   rotation_status = ser.readline().decode('utf-8')
   return rotation_status

您還需要導入 json 以將響應載入為 dict

例如

>>> import json

>>> rotation_status='{"Drop":"Successful"}'
>>> json.loads(rotation_status)
{'Drop': 'Successful'}

現在您已經準備好這些程式碼,您可以呼叫它們以根據結果持續執行操作

while True:
   status = json.loads(check_status(ser))
   if status['test_switch'] == 0:
       time.sleep(5)
   
   is_rotated = json.loads(rotate_motor(ser))
   if is_rotated['Drop'] == 'Successful':
       time.sleep(60)
   else:
       print('Something went wrong')
       raise Exception(is_rotated)

引用自:https://unix.stackexchange.com/questions/698828