Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    UART Creation Problem

    Scheduled Pinned Locked Moved WiPy 2&3
    wipyuart
    4 Posts 2 Posters 908 Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • J Offline
      jmpratt
      last edited by

      I have two Wipy 3.0s. The following code works fine on one, but on the other uart1 does not get created. I am putting these boards into the one hardware setup. The only difference is the boards themselves. Is there a hardware failure that would cause this error?

      The REPL error is at the end of this post.

      from machine import UART  #  for serial communication
      from utime import sleep # For delaying in seconds, MicroPython version
      import time
      
      
      
      def sdi_setup():
          # initialize UART port to communicate with SDI-12 translator board
          uart1 = UART(1, baudrate=9600, pins=('P9','P10'))   # init with given UART port & baudrate (tx, rx)
          uart1.init(baudrate=9600, bits=8, parity=None, stop=1, pins=('P9','P10'), timeout_chars=10)  # init with given parameters
          
          print(uart1)
          global sdi_12_address
          # setup SDI-12 addresses.  Valid addresses are single character.
          sdi_12_address=''
          #user_sdi_12_address=input('Enter all SDI-12 sensor addresses, such as 1234:')
          user_sdi_12_address = '01'
          user_sdi_12_address=user_sdi_12_address.strip() # Remove any \r from an input file typed in windows
          for an_address in user_sdi_12_address:
              if ((an_address>='0') and (an_address<='9')) or ((an_address>='A') and (an_address<='Z')) or ((an_address>='a') and (an_address<='z')):
                  print("Using address:",an_address);
                  sdi_12_address=sdi_12_address+an_address
              else:
                  print('Invalid address:',an_address)
      
      
      def sensor_info():
          global sdi_12_address
          sensor_dict = {} # init dictionary to hold sensor info
          for an_address in sdi_12_address:
              # print(an_address+'I!')
              uart1.write(an_address+'I!')
              sleep(1)  #give time for sensor to respond
              sdi_12_line=uart1.readline().decode().strip()
              sensor_txt = 'Sensor address & info,' + an_address + ',' + sdi_12_line + '\n'
              print(sensor_txt)
              sensor_info=sdi_12_line.split(',') #  create list of values
              sensor_dict[an_address] = sensor_info #  store in dict, sensor address is the key
          print(sensor_dict)
          return sensor_dict
      
      def sensor_measurement():
          measurement_dict = {}  # initialize dictionary to hold measurement values
          for j in sdi_12_address:
              str_j = str(j)
              uart1.write(str_j + 'M!')
              sleep(1) # keep at or above 1 second to ensure all respones from sensor are captured
              meas_delay = uart1.readall().decode().strip()  # read sensor response, time until ready
              meas_delay = meas_delay[len(str_j):]
              try:
                  meas_delay = float(meas_delay[:3])
              except:
                  meas_delay = 3
                  print ('Delay exception')
              sleep(meas_delay) # sleep until measurement is ready
              uart1.write(str_j + 'D0!')  # tell sensor to send data
              sleep(.5)  # dealy to allow data to be sent to UART
              sensor_values = uart1.readall().decode().strip().replace('+',',') # read data
              now = time.localtime()
              time_stamp = "%04d/%02d/%02d,%02d:%02d:%02d" % (now[0], now[1], now[2], now[3], now[4], now[5])
              sensor_values=sensor_values.split(',') #  create list of values
              sensor_values.pop(0)  # remove sensor address from list
              sensor_values = [float(i) for i in sensor_values]  # clean data, convert to floats
              sensor_values.insert(0,time_stamp)  # add timestamp as first value of list
              measurement_dict[j] = sensor_values #  store in dict, sensor address is the key
      
          print(measurement_dict)
          return measurement_dict
      
      if __name__ == "__main__":
          sdi_setup()
          sensor_info()
          sensor_measurement()
      
      

      configsip: 0, SPIWP:0xee
      clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
      mode:DIO, clock div:1
      load:0x3fff8028,len:8
      load:0x3fff8030,len:1728
      load:0x4009fa00,len:0
      load:0x4009fa00,len:14584
      entry 0x400a059c
      WLAN connected ip 192.168.1.52 gateway 192.168.1.1
      SD card mounted
      None
      SD card found
      2018-07-22T01:17:48+00:00
      /sd/20180722.csv
      UART(1, baudrate=9600, bits=8, parity=None, stop=1)
      Using address: 0
      Using address: 1
      Traceback (most recent call last):
      File "main.py", line 5, in <module>
      File "/sd/sd_main.py", line 85, in <module>
      File "/sd/measure.py", line 32, in sensor_info
      NameError: name 'uart1' is not defined
      Pycom MicroPython 1.18.0 [v1.8.6-849-046b350] on 2018-06-01; WiPy with ESP32
      Type "help()" for more information.

      robert-hhR 1 Reply Last reply Reply Quote 0
      • robert-hhR Offline
        robert-hh @jmpratt
        last edited by robert-hh

        @jmpratt The error tells that uart1 is not defined in sensor_info(), which is obvious, because it is not in scope. You may have to declare uart1 global in sdi_setup(), sensor_info() and sensor_measurement, like you did with sdi_12_address.

        You may consider to put that all into a class, or hand over uart1 and sdi_12_address between the functions by return values and functions arguments. That make information passing more clear.

        J 1 Reply Last reply Reply Quote 0
        • J Offline
          jmpratt @robert-hh
          last edited by

          @robert-hh Thanks. I'll rewrite that part of the code.

          However, why would this code work on one WiPy and not the other? That makes me thing there is another, hardware specific issue.

          robert-hhR 1 Reply Last reply Reply Quote 0
          • robert-hhR Offline
            robert-hh @jmpratt
            last edited by

            @jmpratt I cannot believe that you have the same code on both WiPy's. Please reload the code to both devices, reset them and try.

            1 Reply Last reply Reply Quote 0

            Hello! It looks like you're interested in this conversation, but you don't have an account yet.

            Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

            With your input, this post could be even better 💗

            Register Login
            • 1 / 1
            • First post
              Last post

            Pycom on Twitter

            Pycom