martes, 1 de septiembre de 2009

Nueva prueba de comunicacion serial con GAMBAS

Hola a todos de nuevo!

Bien, pues el dia de hoy y despues de varios infructuosos intentos de hacer la comunicacion con la aplicacion que estoy desarrollando, me puse a pensar un poquito Laughing

Me volví a fijar en el archivo que viene de ejemplo en GAMBAS 2, y pues ya que me cayo el 20, decidi, de nuevo emplear todas las opciones de la conexion por el puerto serial, y bueno ahora usando la interfaz usb-serie, que por cierto para linux no requiere de algún tipo en partícular de driver.

basado en esto y analizando mas a conciencia el código de ejemplo vi los siguientes aspectos

1. Existe una funcion para abrir el puerto (Demasiado obvio, pero por esto mismo me equivoque en el anterior), no unicamente se pasan los paramtros, sino que tambien, se hace necesario un chequeo de estado pasando a unos indicadores chkbox los valores de algunos valores importantes de la comunicacion serial como son Ring, DCD, CTS, etc. en este caso, si todo va bien, al hacer el chequeo, unicamente se marcarán DTR, RTS (Data Terminal Ready - Request to Send) Que nos indican que la terminal de datos esta lista para funcionar y que ademas esta en petición para enviar datos
Fuente: http://www.beyondlogic.org/serial/serial.htm

2. Una parte de asignación de cambio de valores booleanos a los chkbox de los pines del RS232

3. La implementación de la función de lectura, usando el comando READ a través de un flujo (stream) que viene del objeto instanciado hacia el Puerto Serial. y almacenandolo en una cadena llamada s.

4. El envio de datos, es la parte que personalizamos, para poder enviar datos, primero debemos verificar que se encuentre activo el puerto serie, esto se hace usando el siguiente comando

IF ttyUSB.Status = Net.Inactive THEN

posterior a esto puede colocar una ventana de mensaje o algún otro tipo de dato; en el ELSE usted podrá colocar el envio de los datos, para nosotros fué más facil el pensar en trabajarlo con un PRINT a través de flujo (stream) #ttyUSB, quedando de esta forma

PRINT #ttyUSB, "a" 'Esto envia el caracter ascii de la letra 'a' por el puerto serial, siempre y cuando este abierto dicho puerto.

para el envio de los datos use, dos commmandButton, que envian únicamente una letra por cada clic, y un slider con un spinbox, como lo hice en el programa anterior, pero ademas, coloque, dos toolbutton, que ya se que no son para eso pero los use como indicadores cyclops cambiando de color cuando un dato ha sido enviado.

Tuve problema primero, pues al enviar cantidades pequeñas de datos, es decir, unas 3 letrs, todo trabajaba a la perfección, el problema se sucitó, cuanod enviaba mas de 10 elementos, y pues esto se moría, y bueno como se arreglo mas o menos el asunto, espero en verdad encontrar una mejor solución.

Colocando un wait 0.1 que genera un retardo de 100ms, tiempo suficiente para que enie el dato y le de chance a nuestro programa que responda de forma adecuada, de hecho así lo hizo!!!

les dejo el código fuente que hemos realizado

Código:

' Gambas class file
'Midiendo con el Osciloscopio, el ancho de pulso de la tarjeta mide 1500us
'si con en programa, suponemos que por cada caracter que envie al micro, un servo tendrá un
'movimiento de un grado, parece que este dato es totalmente erroneo, a pesar de que los
'calculos esten bien realizados.

'Para iniciar el programa solo manda caracteres, pero creo que estos incluyen muchos
'CR & LF en los cuales el micro al recibirlos se ataranta.
'como recibi muchos datos y tambien los envia, es impresindible que solo
'envie una señal cuando yano reciba datos, pero como asegurarnos que ha recibido
'el correcto numero de pulsos, que no sea a traves del uso del printf
' y/o de alguna incorrecta inicializacion de otro dispositivo
' el uso de wait, realmente ha hecho que el programa sea muy lento

'Variables Globales

PUBLIC vini1 AS Integer
PUBLIC vfin1 AS Integer

PUBLIC tempo AS Integer




PUBLIC SUB Form_Close()
IF ttyUSB.Status = Net.Active THEN CLOSE ttyUSB
END


'***************************Seccion para la comunicacion del puerto serial
'Esta parte es bastante modificable

PUBLIC SUB Check_Status()

ChkDSR.Value = ttyUSB.DSR
ChkDTR.Value = ttyUSB.DTR
ChkCTS.Value = ttyUSB.CTS
ChkRTS.Value = ttyUSB.RTS
ChkDCD.Value = ttyUSB.DCD
ChkRNG.Value = ttyUSB.RNG


END

PUBLIC SUB Form_Open()
cmdVelocidad.Index = cmdVelocidad.Find("115200")
vini1 = 0
vfin1 = 0
sldS1.Value = 90
END



PUBLIC SUB Button1_Click()

ME.Close

END



PUBLIC SUB cmdAbreCierra_Click()

IF ttyUSB.Status = Net.Active THEN
CLOSE ttyUSB
cmdAbreCierra.Text = "Abre"
ELSE
'Linea de parametros
ttyUSB.PortName = txtPortText.Text
ttyUSB.Speed = cmdVelocidad.Text
ttyUSB.Parity = cmbParidad.Index
ttyUSB.DataBits = cmbDataBits.Text
ttyUSB.FlowControl = cmbControlFlujo.Index
ttyUSB.StopBits = cmbBitParo.Text

ttyUSB.Open()
Check_Status()
TextArea1.Text = "Puerto Abierto : " & ttyUSB.PortName & " Ajustes : " &
ttyUSB.Speed & " , " & ttyUSB.Parity & " , " & ttyUSB.DataBits & " , " &
ttyUSB.StopBits & " , " & Chr(13) & Chr(10)
cmdAbreCierra.Text = "Cierra"
ENDIF
END

PUBLIC SUB ttyUSB_Read()
DIM s AS String


IF TabStrip1.Text = "Configuracion" THEN
READ #ttyUSB, s, Lof(ttyUSB)
TextArea1.Text = TextArea1.Text & s
ELSE IF TabStrip1.Text = "Servo 1" THEN
READ #ttyUSB, s, Lof(ttyUSB)
TextArea2.Text = TextArea2.Text & s
ENDIF
END


PUBLIC SUB ttyUSB_RNGChange(ival AS Boolean)

ChkRNG.Value = ival

END

PUBLIC SUB ttyUSB_DTRChange(ival AS Boolean)

ChkDTR.Value = ival

END

PUBLIC SUB ttyUSB_DSRChange(ival AS Boolean)

ChkDSR.Value = ival

END

PUBLIC SUB ttyUSB_CTSChange(ival AS Boolean)

ChkCTS.Value = ival

END

PUBLIC SUB ttyUSB_DCDChange(ival AS Boolean)

ChkDCD.Value = ival

END

PUBLIC SUB ttyUSB_RTSChange(ival AS Boolean)

ChkRTS.Value = ival

END

PUBLIC SUB ChkDTR_Click()

ttyUSB.DTR = ChkDTR.Value
Check_Status

END

PUBLIC SUB ChkRTS_Click()

ttyUSB.RTS = ChkRTS.Value
Check_Status

END

PUBLIC SUB cmbControlFlujo_Click()

ttyUSB.FlowControl = cmbControlFlujo.Index

END



'************************************************************************************************
'Esta parte corresponde a los controles que se encuentran en el tab SERVO 1
'Los primeros son dos botones con dos toolbuttons que sirven como leds indicadores
'La segunda parte corresponde a un spinbox y aun slider

PUBLIC SUB cmdAtras_Click()

IF ttyUSB.Status = Net.Inactive THEN
Message("Primero abre el Puerto, NO JODAS")
ELSE
PRINT #ttyUSB, "a"
ToolButton2.Background = &FF0000&
ToolButton2.Text = "A"
WAIT 0.3 'Este retardo es para el parpadeo, entre colores, pero no tiene mucho caso
ToolButton2.BackColor = &00FF00&
ToolButton2.Text = ""
ENDIF
END

PUBLIC SUB cmdAdelante_Click()

IF ttyUSB.Status = Net.Inactive THEN
Message("Primero abre el puerto NO JODAS")
ELSE
PRINT #ttyUSB, "11"
ToolButton1.Background = &FF0000&
ToolButton1.Text = "1"
WAIT 0.3
ToolButton1.Background = &00FF00&
ToolButton1.text = ""
ENDIF
END
'**************************************************************************
PUBLIC SUB spnboxS1_Change()
DIM maximo AS Integer
DIM i AS Integer

sldS1.Value = spnboxS1.Value
vfin1 = spnboxS1.Value
tempo = 0

tempo = Abs(vfin1 - vini1)

IF (vfin1 - vini1) < 0 THEN
IF ttyUSB.Status = Net.Active THEN
maximo = tempo
FOR i = 1 TO maximo
PRINT #ttyUSB, "AAA"
ToolButton2.Background = &FF0000&
ToolButton2.Text = "A"
WAIT 0.1 'Este retardo es importante, ya que la tarjeta no responde muy rápido

ToolButton2.BackColor = &00FF00&
ToolButton2.Text = ""
NEXT
maximo = 0
ELSE
Message.Info("NO JODAS A")
ENDIF

ELSE
IF ttyUSB.Status = Net.Active THEN
maximo = tempo
FOR i = 1 TO maximo
PRINT #ttyUSB, "111"
ToolButton1.Background = &FF0000&
ToolButton1.Text = "1"
WAIT 0.1
ToolButton1.Background = &00FF00&
ToolButton1.text = ""
NEXT
maximo = 0
ELSE
Message.info("NO JODAS 1")
ENDIF
ENDIF
vini1 = vfin1

END
'**********************************************************************************
PUBLIC SUB sldS1_Change()
DIM maximo AS Integer
DIM i AS Integer

spnboxS1.Value = sldS1.Value
vfin1 = spnboxS1.Value
tempo = 0

tempo = Abs(vfin1 - vini1)

IF (vfin1 - vini1) < 0 THEN
IF ttyUSB.Status = Net.Active THEN
maximo = tempo
FOR i = 1 TO maximo
PRINT #ttyUSB, "AAA"
ToolButton2.Background = &FF0000&
ToolButton2.Text = "A"
WAIT 0.3
ToolButton2.BackColor = &00FF00&
ToolButton2.Text = ""
NEXT
maximo = 0
ELSE
Message.Info("NO JODAS A")
ENDIF

ELSE
IF ttyUSB.Status = Net.Active THEN
maximo = tempo
FOR i = 1 TO maximo
PRINT #ttyUSB, "111"
ToolButton1.Background = &FF0000&
ToolButton1.Text = "1"
WAIT 0.3
ToolButton1.Background = &00FF00&
ToolButton1.text = ""
NEXT
maximo = 0
ELSE
Message.info("NO JODAS 1")
ENDIF
ENDIF
vini1 = vfin1


END

PUBLIC SUB cmdBorrar_Click()

TextArea2.Text = ""

END

PUBLIC SUB cmdColor_Click()

cmdColor.text = "Rojo"
FMain.BackColor = &H00FF0000&

END








Lo mas padre de todo esto es que si funciona aunque lento pero funciona.