Hola AKENAFAB Gracias por responder.
Para comunicarme con cada esclavo realizo la interrupcion por serial en CCS, cada dato que recibo aumenta un contador y se va a una funcion donde tengo un select CASE
Resumire el codigo en CCS
Funcion de interrupcion, donde recibo cada dato:
#int_rda
//SERVICIO DE INTERRUPCIÓN POR RS232
void rda_isr()
{
char charrcv=0x00; // Ultimo caracter recibido
if(kbhit()){// Si hay algo pendiente de recibir ...
charrcv=getc(); // lo descargo y ...
add_modbus(charrcv); // lo añado al buffer
}
}
void add_modbus(char c){
int x;
dat=dat+1;
if(dat<=10) // La trama tiene 10 datos
{
switch (puntero)
{
x = aschex2int(c); //En esta funcion paso de ASCII(0x31==0x01) a Hexa para preguntar por el esclavo, ya que el dato llega en ASCII
case 0:// recibo el esclavo a quien va dirigido
if (c==0x01 && dat==1) //si el comando es para mi y es el inicio de trama
{
modbus.trama[0]= x;
puntero+=1; // Aumento el case
prote+=1; // Garantizo una proteccion para que siga las intucciones paso a paso
}
else
{
puntero =0;
dat=0; // Si no es inicio de trama y nos es 0x01 inmediatamente vuelve a esperar caracteres, para poder continuar
//pausa_rx=true;
}
break;
case 1:// recibo el comando
x = aschex2int(c); En esta funcion paso de ASCII a Hexa para preguntar por la funciona realizar, ya que el dato llega en ASCII
if (c == 0X04 && dat==2) //si es un comando conocido, este tiene que ser el segundo dato de la trama para entrar
{
modbus.trama[1]= x;
puntero+=1;
prote+=1;
}
else
{
pausa_rx=true;
OUTPUT_HIGH(PIN_C2); // Led que indica error
init_cbuff(); // Si en la trama entra al CASE 0 pero no se cumple el CASE 1, el pic no responde y sigue a la espera..
}
break;
Una vez se cumplieron los dos pre-requisitos entra toda la trama y se va para la funcion donde transmite.
if (prote==2){
OUTPUT_LOW(PIN_C3) // Habilito un led para que se vea si entra
flagcommand=1; // Bandera para llamar la funcion donde se transmite
}
void commad_process(void){
OUTPUT_HIGH(PIN_C5); // habilito el pin C5 para transmicion por 485
if(pausa_rx!=1){ // Si no fallo ninguno de los pre_requisitos de SELECT CASE entra.
printf("%x%x%x%x%x%x%x%x%x%x%x\r\n",modbus.trama[0],modbus.trama[1],....) // Trama de respuesta del pic
}
OUTPUT_LOW(PIN_C5); // DesHabilito el enable para 485
init_cbuff();// Funcion donde Borro buffer, he inicializo todas las variables para volvera esperar la trama correcta para el esclavo
}
Funcion donde inicializo todo de nuevo, una vez se transmita o se presenten que no es la trama, para que siga esperando
void init_cbuff(void){
int i;
OUTPUT_LOW(PIN_C5); //
for(i=0;i<lenbuff;i++){// Bucle que pone a 0 todos los
modbus.trama
=0x00; // caracteres en el buffer
}
puntero=0; // Indice de Selcte CASE
pausa_rx=0;
dat=0;
prote=0;
}
El codigo es mucho mas largo pero en resumidas cuentas es lo que realizo para transmitir Y recibir los datos, no se que pueda estar hacuendo mal
Para enviar cada trama a los diferentes esclavos, envio la trama a un esclavo y no envio la siguiente para otro hasta que el primero responda.