Skip to main content
Visitor II
August 31, 2023
Question

Not receiving data from STM 32 Nucleo

  • August 31, 2023
  • 0 replies
  • 819 views

In this code, when I use the temp command, I always get output as "No response received." That means my python CLI is not receiving any data from the STM 32 board. But when I run the same command on the screen terminal on my mac, I get the data. What could the problem be? I have ensured that the serial port configuration in my Python code (baud rate, data bits, stop bits, etc.) matches exactly with the configuration used when tested with screen.


 

import sys
import argparse
import configparser
import yaml
import serial
from rich import print

# Default values
DEFAULT_SERIAL_PORT = "/dev/cu.usbmodem14303"
BAUD_RATE = 115200

# Load configuration from the .ini file (if present)
config = configparser.ConfigParser()
config.read("config.ini")

# Override default values with values from the .ini file (if present)
serial_port = config.get("cli_params", "serial_port", fallback=DEFAULT_SERIAL_PORT)

# Parse command-line arguments
parser = argparse.ArgumentParser(description="My CLI Application")
parser.add_argument("--serial-port", type=str, default=serial_port, help="Serial port to use.")
args = parser.parse_args()

# Override values with command-line arguments
serial_port = args.serial_port

# Load commands from the YAML file
def load_commands(filename):
 with open(filename, "r") as file:
 commands_data = yaml.safe_load(file)
 
 commands = {}
 for cmd_data in commands_data.get("Commands_1", []):
 cmd_name = cmd_data["Command"]
 commands[cmd_name] = cmd_data

 return commands

# Function to send a command to the STM32 board via serial
def send_command(serial_port, command):
 with serial.Serial(serial_port, BAUD_RATE, timeout=5) as ser:
 ser.write(command)

# Modify the receive_response function
def receive_response(serial_port, response_length=16):
 with serial.Serial(serial_port, BAUD_RATE, timeout=1) as ser:
 ser.flushInput() # Clear the input buffer
 response = ser.read(response_length) # Read the specified number of bytes
 return response

if __name__ == "__main__":
 try:
 # Load commands from the YAML file
 commands = load_commands("commands.yaml")

 # Print the available commands for the IES module
 print("Available commands for IES module:")
 print("Command | R/W | Notes")
 print("----------------------")
 for cmd_name, cmd_data in commands.items():
 print(f"{cmd_name} | 0x{cmd_data['ID']:02X} | {cmd_data['R/W']} | {cmd_data['Notes']}")

 while True:
 # Get the command from the user input or use a default command for testing purposes
 user_input = input("Enter command: ").strip().lower()

 if user_input == "exit":
 print("Exiting...")
 break
 
 # Check if the command exists in the commands dictionary
 if user_input not in commands:
 print(f"Invalid command: {user_input}")
 continue

 # Translate the command name to the command ID
 command_data = commands[user_input]
 command_id = command_data['ID']

 # Send the command to the STM32 board
 send_command(serial_port, bytes([command_id]))

 if user_input == "temp":
 response = receive_response(serial_port, response_length=16)
 if response:
 print(f"Received response (raw bytes): {response}")
 print(f"Response length: {len(response)} bytes")
 else:
 print("No response received.")

 else:
 response = receive_response(serial_port)
 if response:
 print(f"Received response (raw bytes): {response}")
 else:
 print("No response received.")

 except KeyboardInterrupt:
 print("\nExiting...")
 sys.exit(0)

 

    This topic has been closed for replies.