Pagina 1 di 1

comunicazione seriale in HI-TECH C ricevere 5 caratteri

MessaggioInviato: 3 feb 2019, 18:57
da Grio
Ho realizzato una connessione seriale tra un PC e una scheda con PIC 16f877 con Max232n
il PC trasmette da una casella di testo realizzata con visual basic 6 usa il protocollo
MSComm1.output=char$ (text1.text)
e
il PIC riceve su
interrupt isr(void)
if (RCIF)
input=getch()

input è una variabile di tipo char
per programmare il PIC uso MPLAB ide v 8.63 con HI-TECH c
la comunicazione sia in ricezione che in trasmissione funziona correttamente se trasmetto un carattere o un valore numerico <255 io pero ho bisogno di inserire in una variabile del PIC un valore di almeno 5 numeri purtroppo dopo aver provato e letto sono arrivato alla conclusione che la mia conoscenza in materia non e sufficiente pertanto sono qui a chiedere il vostro aiuto un doveroso grazie in anticipo .

Re: comunicazione seriale in HI-TECH C ricevere 5 caratteri

MessaggioInviato: 6 giu 2019, 9:08
da StefDrums
Ciao,
hai provato a sniffare la comunicazione con un altro programma? ti consiglio:
https://realterm.sourceforge.io/

inoltre, puoi essere più preciso? non si capisce molto cosa devi fare:
Grio ha scritto:ho bisogno di inserire in una variabile del PIC un valore di almeno 5 numeri


hai controllato che baud rate, bit di parità, bit di stop, controllo HW di CTS e RTS siano settati nel modo corretto?

Grio ha scritto:MPLAB ide v 8.63 con HI-TECH c

quanti ricordi!

Re: comunicazione seriale in HI-TECH C ricevere 5 caratteri

MessaggioInviato: 30 giu 2019, 11:27
da marioursino
Come mai usi questo compilatore?
Comunque sia, dopo aver letto il carattere devi azzerare RCIF, altrimenti l’interrupt non verrà più sparato. Se devi ricevere n caratteri di conviene riempirci incrementalmente un vettore. Dovresti anche inserire qualcosa che gestisca gli errori, tipo un timer che dopo il primo carattere resetti la trasmissione se questa si ferma per troppo tempo.

Re: comunicazione seriale in HI-TECH C ricevere 5 caratteri

MessaggioInviato: 30 giu 2019, 16:28
da MarcoD
Concordo con quanto scritto da Foto Utentemarioursino, che ne sa molto più di me.

Se proprio non sai come convertire un numero intero di 8 cifre in caratteri, allego una brutta funzione in linguaggio "processing" che ho scritto pochi giorni fa e che probabilmente fa quel che ti serve.
Se vuoi, ho anche quella duale dai carattri al numero.
Se poi ne scrivi una più elegante inviami il testo.
O_/

Codice: Seleziona tutto

void set_frequency(int SETFREQ)
{
  int NUM;
//  print("  SETFREQ=", SETFREQ);
//  print(" S");
CMHZ = (SETFREQ/10000000);  NUM = SETFREQ - CMHZ*10000000;
DMHZ = (NUM/1000000);  NUM = NUM - DMHZ*1000000;
MHz = (NUM/100000); NUM = NUM - MHz*100000;
CKHZ =(NUM/10000); NUM = NUM - CKHZ*10000;
DKHZ =(NUM/1000);  NUM = NUM - DKHZ*1000;
kHz =(NUM/100);  NUM = NUM - kHz*100;
CHZ=(NUM/10); NUM = NUM - CHZ*10;
DHZ=(NUM);

//print("   ",CMHZ); print( DMHZ);  print( MHz);  print( CKHZ);  print( DKHZ);  print( kHz);  print( CHZ);  print( DHZ);
//print("  ", CMHZ,DMHZ,MHz,CKHZ,DKHZ,kHz,CHZ,DHZ);
   
DATA1 = char(CMHZ *16 + DMHZ);
DATA2 = char(MHz *16 + CKHZ);
DATA3 = char(DKHZ *16 + kHz);
DATA4 = char(CHZ *16 + DHZ);
DATA5 = char(01); //codice comando " set frequency"
myPort.write(DATA1); myPort.write(DATA2); myPort.write(DATA3); myPort.write(DATA4); myPort.write(char(01));
// print("  ",DATA1,DATA2,DATA3,DATA4,DATA5);
}


post scriptum:
Se non servono due caratteri BCD per byte, si può dividere per potenze di 256 invece che di 10.