Asked
— Edited

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)
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...
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.
@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
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
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:
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.
Did you try the release mentioned in my previous post?
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?
Correct - with your previous script