Saludos a toda la comunidad, escribo por lo siguiente estoy estableciendo una comunicacion USB tipo CDC para emular un puerto COM virtual y poder hacer una comunicacion usb entre el pic 18F4550 y Matlab, hasta ahor puedo enviar y recibir datos sin problema, la cuestion es que cuando reinicio el PIC o lo saco para Reprogramarlo e intento nuevamente conectar el PIC me aparece el siguiente error en matlab:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
?? Error using ==> serial.fopen at 72
Port: COM7 is not available. Available ports: COM7.
Use INSTRFIND to determine if other instrument objects are connected to the requested
device.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Aparentemente matlab no cierra el puerto a pesar de que uso las intrucciones adecuadas que recomienda matlab para el uso del puerto serie
No se si tengo algun error en el codigo de matlab o del pic, Aca los subo ambos codigos.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Codigo Matlab
%Programa de prueba para enviar y recibir datos desde un puerto serial
%virtual, se usa conexion USB tipo CDC para emular un puerto serial virtual
%ABRIR el puerto COM&
clc;
clear all;
close all;
%% FUNCION PARA RECIBIR DATOS CONTINUAMENTE
out = 0;
disp('BEGIN')
clear SerPIC
instrumentObjects=instrfind % don't pass it anything - find all of them.
%fclose(instrumentObjects);
delete(instrumentObjects);
SerPIC = serial('COM7');
set(SerPIC,'BaudRate',9600);
set(SerPIC,'DataBits',8);
set(SerPIC,'Parity','none');
set(SerPIC,'StopBits',1);
set(SerPIC,'FlowControl','none');
while out~= 15
%% Recibir Informacion por el puerto Serie
fopen(SerPIC);
out = fread(SerPIC,1,'uint8')
%CERRAR el puerto COM6 al finalizar
fclose(SerPIC);
delete(SerPIC);
clear SerPIC ;
disp('STOP');
end
%% Enviar informacion por el puerto
fopen(SerPIC); % Se abre el puerto serie virtual Com7
pause(0.2);
% En el microcontroaldor se recibe el numero en tipo char y luego lo
% convierte de codigo ASCII a entero.
for i=1:15 % la variable i no puede sobrepasar 255 que es el numero maximo de digitos en el codigo ASCII
unicodestr = native2unicode(i); % Convierte el entreo i (0 a 255) a codigo ASCII
fprintf(SerPIC,'%c',unicodestr);% El codigo Asci se envia como char
pause(0.2);
%fopen(SerPIC);
%data = uint8(fscanf(SerPIC,'%c',[1]))
out = fread(SerPIC,1,'uint8')
%out = fscan(SerPIC)
end
%CERRAR el puerto COM7 al finalizar
fclose(SerPIC);
delete(SerPIC)
clear SerPIC
disp('STOP')
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//// ////
//// RR2_USB_Cdc_Monitor.c ////
//// CDC = Comunication Devide Class ////
/////////////////////////////////////////////////////////////////////////
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
//#include ".\include\usb_cdc.h"
#include "usb_cdc.h"
#include "rr2_USB_Cdc_Monitor.h"
#define LEDV PIN_E0 // asignacion pin al led verde que indica que el dispositivo ha sido detectado
#define LEDR PIN_E1 // // asignacion pin al led rojo que indica que el dispositivo no ha sido detectado
#define LED_ON output_high // definicion constante para el llamado de las funciones de prender y apagar los leds
#define LED_OFF output_low
//#rom int 0xf00000={1,2,3,4}
int8 cont_p=9, conteo=0,menu=0,num;
//int8 letra;
char letra;
char c,d;
void config_micro(void);
void leer(void);
int aschex2int(char d);
void main(void) {
config_micro(); // configura parametros iniciales del microcontrolador
LED_OFF(LEDV); // pilotos que indican la conexion
LED_ON(LEDR);
delay_ms(300);
usb_cdc_init(); // se inicializa la conexion usb en modo CDC (puerto virtual com)
usb_init(); // inicia la conexion usb
while (!usb_cdc_connected()) {}// si no esta conectado no hace nada
while (true)
{
usb_task();
if(usb_enumerated())
{
LED_OFF(LEDR); // si esta conectadose enciende led verde y se apaga el led rojo
LED_ON(LEDV); //
if (usb_cdc_kbhit())
{
c = usb_cdc_getc(); // Recibe dato desde matlab
//num = aschex2int(c);
output_d(c);
}
// c= (char)c;
// usb_cdc_putc(14);
//***************************************************************************8
if (input_state(pin_E2)==1)
{
conteo ++;
usb_cdc_putc(conteo); // envia el valor de conteo si presiona pulsador en RE2
delay_ms(100);
}
}
else{
LED_OFF(LEDV); // si esta desconectado se enciende led rojo y se apaga el led verde
LED_ON(LEDR); //
}
}
}
/******************************************************
*
*
*
*
******************************************************/
void config_micro(void){
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0xff); //configuracion puertoa a de entrada
set_tris_b(255); // puerto b congfigurado como de salida
set_tris_d(0x00);// puerto d congfigurado como de salida
set_tris_e(0x4); // puerto e congfigurado como de salida
output_d(0);
output_e(0);
}
//******************************************************************************