MicroC rs-485, pic16f887 Problemas de envío de cadenas

-1

¿Cómo puedo enviar la cadena "prueba" de una foto maestra a un esclavo?

Estoy usando el ejemplo de la biblioteca MicroC RS-485:

enlace

Estoy intentando enviar una cadena del maestro al esclavo: y configurando dat [7]="mi cadena"; esperando dat [7] en el esclavo con mi cadena pero estoy obteniendo un valor vacío ...

Código original en la parte inferior del enlace.

Maestro

char dat[10];                          // buffer for receving/sending messages
char i,j;

sbit  rs485_rxtx_pin  at RC2_bit;               // set transcieve pin
sbit  rs485_rxtx_pin_direction at TRISC2_bit;   // set transcieve pin direction

// Interrupt routine
void interrupt() {
  RS485Master_Receive(dat);
}

void main(){
  long cnt = 0;

  ANSEL  = 0;                          // Configure AN pins as digital I/O
  ANSELH = 0;
  C1ON_bit = 0;                        // Disable comparators
  C2ON_bit = 0;

  PORTB  = 0;
  PORTD  = 0;
  TRISB  = 0;
  TRISD  = 0;


  UART1_Init(9600);                    // initialize UART1 module
  Delay_ms(100);

  RS485Master_Init();                  // initialize MCU as Master
  dat[0] = 0xAA;
  dat[1] = 0xF0;
  dat[2] = 0x0F;
  dat[4] = 0;                          // ensure that message received flag is 0
  dat[5] = 0;                          // ensure that error flag is 0
  dat[6] = 0;
  dat[7] = "MY STRING";

  RS485Master_Send(dat,1,160);


  RCIE_bit = 1;                        // enable interrupt on UART1 receive
  TXIE_bit = 0;                        // disable interrupt on UART1 transmit
  PEIE_bit = 1;                        // enable peripheral interrupts
  GIE_bit = 1;                         // enable all interrupts

  while (1){
                                       // upon completed valid message receiving
                                       //   data[4] is set to 255
    cnt++;
    if (dat[5])  {                     // if an error detected, signal it
      PORTD = 0xAA;                    //   by setting portd to 0xAA
    }
    if (dat[4]) {                      // if message received successfully
      cnt = 0;
      dat[4] = 0;                      // clear message received flag
      j = dat[3];
      for (i = 1; i <= dat[3]; i++) {  // show data on PORTB
        PORTB = dat[i-1];
      }                                // increment received dat[0]
      dat[0] = dat[0]+1;               // send back to master
      Delay_ms(1);
      RS485Master_Send(dat,1,160);

    }
   if (cnt > 100000) {
      PORTD ++;
      cnt = 0;
      RS485Master_Send(dat,1,160);
      if (PORTD > 10)                  // if sending failed 10 times
        RS485Master_Send(dat,1,50);    //   send message on broadcast address
     }
  }

}

Esclavo:

char dat[9];             // buffer for receving/sending messages
char i,j;

sbit  rs485_rxtx_pin at RC2_bit;             // set transcieve pin
sbit  rs485_rxtx_pin_direction at TRISC2_bit;   // set transcieve pin direction

// Interrupt routine
void interrupt() {
 RS485Slave_Receive(dat);
}

void main() {
  ANSEL  = 0;                        // Configure AN pins as digital I/O
  ANSELH = 0;
  C1ON_bit = 0;                      // Disable comparators
  C2ON_bit = 0;

  PORTB = 0;
  PORTD = 0;
  TRISB = 0;
  TRISD = 0;
  PORTA = 0;
  TRISA = 0;


  UART1_Init(9600);                  // initialize UART1 module
  Delay_ms(100);
  RS485Slave_Init(160);              // Intialize MCU as slave, address 160

  dat[4] = 0;                        // ensure that message received flag is 0
  dat[5] = 0;                        // ensure that message received flag is 0
  dat[6] = 0;                        // ensure that error flag is 0

  RCIE_bit = 1;                      // enable interrupt on UART1 receive
  TXIE_bit = 0;                      // disable interrupt on UART1 transmit
  PEIE_bit = 1;                      // enable peripheral interrupts
  GIE_bit = 1;                       // enable all interrupts

  while (1) {
    if(dat[7]=="MY STRING"){
      RCA0_bit = 1;
    }

    if (dat[5])  {                   // if an error detected, signal it by
      PORTD = 0xAA;                  //   setting portd to 0xAA
      dat[5] = 0;
    }
    if (dat[4]) {                    // upon completed valid message receive
      dat[4] = 0;                    //   data[4] is set to 0xFF
      j = dat[3];
      for (i = 1; i <= dat[3];i++){
        PORTB = dat[i-1];
      }
      dat[0] = dat[0]+1;             // increment received dat[0]
      Delay_ms(1);
      RS485Slave_Send(dat,1);        //   and send it back to master
    }
  }
}

    

1 respuesta

1

Creo que no has entendido bien cómo C maneja las cadenas. En resumen, no maneja las cadenas .

dat [10] es una matriz de 10 caracteres, por lo que "dat" es efectivamente un puntero a dat [0], y dat [7] es un solo carácter, el elemento 8 en la matriz. No puede poner una cadena de caracteres en ella, e incluso si pudiera, está escribiendo más allá del final (dat [9]) de la matriz.

Un cambio que podrías intentar sería:

char dat[30]; // Dat is 30 chars long
dat[0] = 0xAA;
dat[1] = 0xF0;
dat[2] = 0x0F;
dat[4] = 0;      // ensure that message received flag is 0
dat[5] = 0;      // ensure that error flag is 0
dat[6] = 0;
dat[7] = 'M';
dat[8] = 'Y';
dat[9] = ' '; // SPACE in this entry, not nothing
dat[10] = 'S';
dat[11] = 'T';
dat[12] = 'R';
dat[13] = 'I';
dat[14] = 'N';
dat[15] = 'G';
dat[16] = '
char dat[30]; // Dat is 30 chars long
dat[0] = 0xAA;
dat[1] = 0xF0;
dat[2] = 0x0F;
dat[4] = 0;      // ensure that message received flag is 0
dat[5] = 0;      // ensure that error flag is 0
dat[6] = 0;
dat[7] = 'M';
dat[8] = 'Y';
dat[9] = ' '; // SPACE in this entry, not nothing
dat[10] = 'S';
dat[11] = 'T';
dat[12] = 'R';
dat[13] = 'I';
dat[14] = 'N';
dat[15] = 'G';
dat[16] = '%pre%'; // C strings expect a NULL on the end
'; // C strings expect a NULL on the end

Al eliminar el final de la matriz (más allá de los datos [9] en su código), se escribirán los datos en otra memoria, probablemente en otras variables que esté usando, y es probable que se produzca un bloqueo.

    
respondido por el John U

Lea otras preguntas en las etiquetas