Hi,
I've established a socket connection between my PC and a karel server running on the robot controller. I'm sending strings of 6 comma separated numbers (ex: "12.3, 23.66, 123.54, 456.23, 232.4, 121.5," )
I'm successful in sending two such strings, but the third one never reaches. Here is my Karel server:
Code
PROGRAM server
%STACKSIZE = 4000
%NOLOCKGROUP
%NOPAUSE=ERROR+COMMAND+TPENABLE
%ENVIRONMENT uif
%ENVIRONMENT sysdef
%ENVIRONMENT memo
%ENVIRONMENT kclop
%ENVIRONMENT bynam
%ENVIRONMENT fdev
%ENVIRONMENT flbt
%ENVIRONMENT REGOPE
%INCLUDE klevccdf
%INCLUDE klevkeys
%INCLUDE klevkmsk
-------------------------------------------------------------------------------
VAR
file_var : FILE
status : INTEGER
entry : INTEGER
loop : BOOLEAN
tmp : INTEGER
pose : XYZWPR
pose_str : STRING[254]
pose_arr : ARRAY[6] OF STRING[254]
iterator : INTEGER
str_start : INTEGER
str_end : INTEGER
-------------------------------------------------------------------------------
BEGIN
SET_FILE_ATR(file_var, ATR_IA)
-- Set the server port before doing a connect
SET_VAR(entry, '*SYSTEM*','$HOSTS_CFG[3].$SERVER_PORT',59002,status)
WRITE('Connecting..',CR)
MSG_CONNECT('S3:',status)
WRITE(' CONNECT STATUS = ',status,CR)
IF status = 0 THEN
-- Open S3:
WRITE ('Opening',CR)
OPEN FILE file_var ('rw','S3:')
status = IO_STATUS(file_var)
WRITE ('FILE STATUS',status,CR)
IF status = 0 THEN
loop = TRUE
WHILE loop = TRUE DO
BYTES_AHEAD(file_var, entry, status)
IF status = 0 THEN
IF entry > 0 THEN
READ file_var(pose_str::entry)
-- Parse the income csv string and extract numbers
str_start = 1
str_end = 1
FOR iterator = 1 TO 6 DO
WHILE SUB_STR(pose_str, str_end, 1) <> ',' DO
str_end = str_end + 1
ENDWHILE
pose_arr[iterator] = SUB_STR(pose_str, str_start, str_end - str_start)
str_start = str_end + 1
str_end = str_start
ENDFOR
WRITE('Pose Received:', CR)
FOR iterator = 1 TO 6 DO
WRITE(pose_arr[iterator], CR)
ENDFOR
WRITE(CR)
-- Modify the position register
CNV_STR_REAL(pose_arr[1], pose.X)
CNV_STR_REAL(pose_arr[2], pose.Y)
CNV_STR_REAL(pose_arr[3], pose.Z)
CNV_STR_REAL(pose_arr[4], pose.W)
CNV_STR_REAL(pose_arr[5], pose.P)
CNV_STR_REAL(pose_arr[6], pose.R)
pose.config_data.CFG_TURN_NO1 = 0
pose.config_data.CFG_TURN_NO2 = 0
pose.config_data.CFG_TURN_NO3 = 0
pose.config_data.CFG_FLIP = FALSE
pose.config_data.CFG_UP = TRUE
pose.config_data.CFG_FRONT = TRUE
SET_POS_REG(1, pose, status)
CALL_PROG('move_to_pr', tmp)
ENDIF
ENDIF
DELAY 50
ENDWHILE
CLOSE FILE file_var
ENDIF
WRITE('Disconnecting..',CR)
MSG_DISCO('S3:',status)
WRITE('Done.',CR)
ENDIF
END server
Display More
The messages are supposed to be read in line 49. What could be going wrong?
Also my c++ client says that it has sent the message.
EDIT: I printed out the variable "entry". The first iteration it was 62, the second was 126. It looks like the second and third messages are somehow being glued together. How can I prevent this?