Asked — Edited
Resolved Resolved by DJ Sures!

Error On Line 25: Missing String Quotes

I'm getting an error message in one of my scripts that is giving me some trouble. It's a random error meaning that it will happen every few times the command is run. It's set in a loop so it will repeat. Sometimes it will even cause the connection between the EZB and computer to cut off. Here'e the error:


Error on line 25: Missing String Quotes or Invalid Expression at index 14: "

and


Error on line 25: Missing String Quotes or Invalid Expression at index 15: "

Here's the script to happens in. Seems to center around the print commands. Once I removed the print command at line 25 and the error skipped to the next one. I've also expanded the sleep() commands thinking it was running too fast but it does not help. Thanks for looking :


# This Script will return the actual position number of the left catrrage
# #from the Kangaroo withough the 1,p in the begining.
# #Returning feedback with the 1,p causes problems.
# #Do Not Delete. Other scripts depend on this script!

# -------------------------------------
# Get Roo position

uartWrite(2, 2, "2, Getp", 0x0d)

:waitForData
Sleep(30)

$y_lft = UartAvailable(2, 2)
Sleep(30)
print("Bytes in buffer:" + $y_lft)

if ($y_lft < 6)
  # Go back and wait for data again because we did not receive the least number of expected bytes.
  goto(waitForData)
endif
Sleep(30)
$Get_Lft_Carrage_P = UARTRead(2, 2, $y_lft)
Sleep(30)
print("Received: " + $Get_Lft_Carrage_P)

Sleep( 50 )

# -------------------------------
# Find out and print if the P is upper or lower case.
# Upper case means motor has finished move ans stoped.
# Lower Case means that motor is still moving.

$P_lft_or_p_lft = GetCharAt($Get_Lft_Carrage_P, 2) #Assign a variable to either a capitol P or Small case p returned by Kangaroo.

Print("P_lft_or_p_lft:" + $P_lft_or_p_lft)

# -----------------------------
# Defeat the P_lft_or_p_lft

if ($P_lft_or_p_lft = "p")
  Goto(Lower_p_Split)
ELSEif ($P_lft_or_p_lft = "P")
  Goto(Upper_P_Split)
endif

Sleep( 50 )

:Lower_p_Split

$Lft_Carrage_Position = Split($Get_Lft_Carrage_P, "p",1) #1,pXXXX is returned. Get everything after the Lower case p (P is case senceitive).
Sleep(30)
print("Received:" + $Lft_Carrage_Position)
Halt()

:Upper_P_Split
$Lft_Carrage_Position = Split($Get_Lft_Carrage_P, "P",1) #1,pXXXX is returned. Get everything after the Upper case P (P is case senceitive).
Sleep(30)
print("Received:" + $Lft_Carrage_Position)

ARC Pro

Upgrade to ARC Pro

Synthiam ARC Pro is a new tool that will help unleash your creativity with programming robots in just seconds!

PRO
Synthiam
#33  

I should also add that using the binary uart commands for roomba will be even easier than attempting to use the ascii uart. This is because your command is stored in an array of bytes. Each index of the array is a different byte. For example, if a packet command was to be 4 bytes, it would simply be something like...


DefineArray($packet, 4)

$packet[0] = 0x20
$packet[1] = 0x30
$packet[2] = 0x10
$packet[3] = 0x15

UartWriteBinary(0, 0, $packet)
PRO
Synthiam
#34  

It's not that some return binary and others return ascii - it's that some values just happen to be within an ascii range.

The bump sensors for example actually use the BITs of a byte. Each BIT represents a sensor value. So all bits off is a 0x00, which is a null character that terminates a string.

#35  

@DJ.... Ok that makes sense... It's strange because bump returns are a single byte while voltage and milliamp capacity are 2 byte return (high and low byte). So what's strange is that Voltage returns ok, but milliamp reads fail... They should be basically identical in what type of data they return, though... Weird

PRO
Synthiam
#36  

It's most likely that the milliamp read is generally a larger number - or who knows.

David, i made an escape "hack" on the UART, i2c and com reads in this update for you: https://synthiam.com/Community/Questions/9933

Because the device is returning strange data, it "may" be visible in the ReadUart() string and introduce parsing struggles. Try it

#37  

Many thanks for taking the time to work on this with me. I'm not adverse to struggle and am enjoying this learning experance. Until I found EZ Robot 5 yrs ago I had never written a script and had no idea on how to get a servo to move or even a DC motor to move in reverse.

@DJ, telling me how binary vrs ASCii works helps me to understand a little better what is happening. I really didn't know that the binary reads are cut up into an array and the reaon sometime the ASCii Uart commands work is because they share some of the same readable characters.

What I'm trying to do with this script is to simply read a position of a carrage running on a rail as it moves and also when it finishes it's move. I have a Kangaroo X2 commanding position control and getting feedback info from an encoder attached to a motor shaft. I have this script looping, reading the position and trun it into a variable. There is a second script watching that variable and when the variable reports that the carrage has reached a certain position a second motor is safe to move and the first looping script will halt.

In real life, one motor (the one being commanded by the Kangaroo with feedback from the encoder) is moving my B9 arm out of the body of the robot on a carrage attached to a rail. Once the arm is compleatly out of the robot only then is it safe for the arm servos and DC motor to start moving it around. I need to know from the Kangaroo what position the rail systmem is in and the carrage is clear of the robot's body so it's safe to move the arm.

The Kangaroo will return the position in the following way:


1,pXXXX 

The 1 is the channel the motor is running on.
The &quot;,&quot; is just a comma.
the &quot;P&quot; is telling if the move is underway or completed. Uppercase for move complete and lowercase of it's seill underway. 
XXXX is the actual position. On my system min position is -8 and max position is 160000. These are lines of the encoder. 

Thanks to your help so far I'm able to understand that I need to use binary commands and am able to get one character. I was getting the "P" to find out if the move has been completed or is still underway. I'd really like to find a way to find out the actual position read. These are the string of numbers after the "P". in my system they could anything from -8 to 160000.

I hope that's understadable. Thanks again for the assist. I'll get that Sabertooth and Kangaroo shipedout to you in a day or so.

PRO
Synthiam
#38  

Did you try the release mentioned in my previous post?

#39  

Oh ,sorry I didn't mention that. Thanks also for doing this extra work. I'll give it a try tonight after work. I assume it should be used with the ASCII Uart commands?

PRO
Synthiam
#40  

Correct - with your previous script