Bien, como sabran, gambas trae un ejemplo base (de hecho a mi se me hizo muy completo!!), del manejo del puerto serial, para esto, probe la tarjeta que mostre en el anterior post, pero ya con la maquina.
Antes que nada el ejemplo si lo instalas en ubuntu, lo vas a encontrar en la siguiente ruta
/usr/share/gambas2/examples/Networking/SerialPort
copia esta carpeta a lugar donde desees de tu home, esto hace que al colocarla en otro lugar, ahora esta carpeta, junto con su contenido te pertenezcan
bueno, ahora aqui tuve un gran problema. probe mi tarjeta con la aplicacion minicom, y pues funciona perfecto, con cada caracter que recibe el micro, este modifica el ancho de pulso del servo que esta controlando, por lo tanto su posicion.
Sin embargo al trabajar con el ejemplo que trae gambas, pues nada que me reconocia el caracter, y es que en el programa del micro que tengo, pasa lo siguiente
*lee el caracter desde el buffer del puerto serial
* lo convierte a mayuscula
* usa switch y case para definir como va a tratar al dato recien llegado
* genera las interrupciones adecuadas para modificar el ancho del pulso
- Código:
do{
if(comando!='\0')
{ //solo entra aqui si comando es diferente a nulo
//comando = toupper(comando);
ComandoValido=0;
printf("%c\r\n",comando);
//delay_ms(1000);
switch(comando){
case '1':{
printf("> S_1 +\r\n");
Servo_PWM[0]+=20;
ComandoValido=1;
}break;
case 'A':{
printf("> S_1 -\r\n");
Servo_PWM[0]-=20;
ComandoValido=1;
}break;
case '2':{
printf("> S_2 +\r\n");
Servo_PWM[1]+=20;
ComandoValido=1;
}break;
case 'B':{
printf("> S_2 -\r\n");
Servo_PWM[1]-=20;
ComandoValido=1;
}break;
default:{
printf("<%c>no se encontro \n",comando);
ComandoValido=0;
disable_interrupts(int_rda);
delay_ms(10);
enable_interrupts(int_rda);
//delay_ms(10);
}break;
}
if(ComandoValido==0) {
if(comando== '\0'){printf("EOL\n");}
else
printf("*%c \n",comando); }
comando='\0';
//delay_ms(1);
}
//delay_ms(50);
}while(1);
imprimiendo entre cada etapa, ahora, pasa algo extraño , el caracter recibido, si me lo imprimia, pero no me lo reconocía, es como si lo borrara. bueno anduve de arriba para abajo con esto.
Sin embargo no me di cuenta de algo!!, despues de unas horas , que el problema no era tanto el codigo del micro, si no mas bien el codigo de gambas, ya que en una parte hace lo siguiente
- Código:
PUBLIC SUB Button2_Click()
IF Sport.Status = Net.Inactive THEN
Message("Open port first!")
ELSE
'Cuando damos clic al boton 2, lee el texto que hay en txtSend y lo manda por el flujo Sport
' Pero ademas de eso envia dos caracteres mas, un Retorno de Carro y Alimentacion de Línea
'Esto me daba en la torre (T_T)
PRINT #Sport, txtSend.Text; Chr$(13); Chr$(10);
END IF
END
En efecto, ahora como pude evitar eso, pues la forma mas sencilla y más rapida que se me ocurrio fue la siguiente.
Si el primer caracter me lo detecta, pero tambien el segundo y hace lo que quiere la tarjeta
Pues entonces, mandale 2 caracteres iguales!!!, pero ambos deben ser mayusculas!!, ya que el programa únicamente
recibe el primer dato, y lo transforma, pero aun no averiguo que diablos le hace al segundo, ya que este ultimo mencionado
es el que acepta.
Bueno aqui les coloco unas imagenes y un video, espero sea de su agrado, algo que se me hizo interesante, deje funcionando la aplicacion un buen de horas y con todo conectado y nunca se trabo, o tuve que cerrar el puerto o abrirlo
Pikitin, la funcion de lectura es la siguiente:
- Código:
PUBLIC SUB SPort_Read()
DIM s AS String 'Variable donde se almacena lo recibido por el buffer
READ #Sport, s, Lof(Sport) 'Leer el stream del puerto, almacenarlo en s y medir su tamaño
TextArea1.Text = TextArea1.Text & s 'manda el texto recibido por el puerto paralelo a un textArea
END