Verwendung des CH376-Moduls mit PIC 18f520

Ich versuche, Daten von einem USB-Gerät mit dem CH376-Modul mit dem Mikrocontroller PIC 18f4520 zu lesen.

Der Name der Datei, die ich zu lesen versuche, ist "ABC.txt" und enthält "hello".

// Instructing module which file to read

SerialTransmit(0x57);
SerialTransmit(0xAB);
SerialTransmit(0x2f);
SerialTransmit(0x2f);
SerialTransmit('A');
SerialTransmit('B');
SerialTransmit('C');
SerialTransmit('.');
SerialTransmit('T');
SerialTransmit('X');
SerialTransmit('T');
SerialTransmit(0x00);

init_lcd();
lcd_string("fn");
function_int(RCREG);
DelayMS(1); 

// Opening the File

SerialTransmit(0x57);
SerialTransmit(0xAB);
SerialTransmit(0x32);

init_lcd();
lcd_string("open");
function_int(RCREG); 
DelayMS(2000);

if(RCREG!=0x14)
   {
    init_lcd();
    lcd_string("open not ok");
    while(1);
    }

 else
    {   
        init_lcd();
        lcd_string("open ok");
        DelayMS(1);
     }
 i=0;

  // Setting to read 5 bytes 

  SerialTransmit(0x57);
  SerialTransmit(0xAB);
  SerialTransmit(0x3A);
  SerialTransmit(0x05); // here
  SerialTransmit(0x00);

 i++;
 init_lcd();
 lcd_string("dl");
 function_int(RCREG);
 DelayMS(2);

 if(RCREG!=0x1D)
{   
   init_lcd();
   lcd_string("dl not ok");
   while(1);
 }

 else   
 {  
    init_lcd(); 
    lcd_string("dl ok");    
    DelayMS(1);
  }

// Reading

SerialTransmit(0x57);
SerialTransmit(0xAB);
SerialTransmit(0x27);

// It reads the first byte here, first byte is a waste byte i.e. 
// it returns 0x05 (The number of bytes we want to read)

init_lcd(); 
lcd_string("0read");
function_int(RCREG);    
DelayMS(3000);

// It reads the first byte here, i.e. H

init_lcd();
lcd_string("1read");
function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);    
DelayMS(3000);

// It is supposed to read 'E' here, but it still reads 'H'

init_lcd();
lcd_string("2read");
function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);
DelayMS(3000);

// It is supposed to read 'L' here, but it still reads 'H'

init_lcd();
lcd_string("3read");
function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);
DelayMS(3000);

while(1);

Ich kann das Modul einrichten und anweisen, die Datei zu öffnen und mit dem Lesen zu beginnen. Aber das Problem ist, dass ich beim ersten Byte hängen bleibe. Ich schaffe es nicht, das zweite Byte zu lesen. Wie kann ich das tun?

Danke, ich würde mich sehr über jede Hilfe freuen.

function_int macht was?
@Dorian Es zeigt den Hex-Wert von Byte an, lcd_data zeigt das tatsächliche Zeichen an
Welchen Compiler verwendest du?
@Dorian, ich verwende MPLAB mit Hi-Tech-Compiler.
Weitere Details finden Sie im Chat

Antworten (1)

Sie können RCREG nicht auf diese Weise verwenden. Sie müssen es in einen Puffer einlesen und dann den Puffer für andere Tests verwenden.

Ich sehe, Sie verwenden:

function_int(RCREG);
lcd_string("==");
lcd_data(RCREG);    

Bei der zweiten Verwendung wird RCREG das nächste empfangene Byte sein, oder die uart-Einheit zeigt einen Fehler an, weil es keine Daten im RCREG-Register gibt.

Außerdem hat Bild 16f4520 keinen Empfangs-FIFO, lange Verzögerungen, die Sie verwenden, führen zu einem Pufferüberlauf und alle empfangenen Bytes gehen verloren.

Verwenden Sie einen temporären Puffer, um alle Bytes ohne Verzögerung zu lesen, und verarbeiten Sie dann die Daten

Der richtige Weg ist:

  • Lesen Sie das RCIF-Flag, um zu sehen, ob Daten in RCREG verfügbar sind
  • Lesen Sie RCREG in einen Puffer und wieder zum ersten Schritt, bis Sie alle erwarteten Bytes gelesen haben.
  • verarbeitet die empfangenen Daten.

Oder verwenden Sie einen Software-UART-Puffer. Wenn Sie MPLABX verwenden, verwenden Sie den Mlab-Code-Konfigurator und die generierten Funktionen. Lesen Sie das RCREG nicht direkt

Aktualisieren. Wenn Sie SerialTransmit verwenden, das darauf wartet, dass der TX-Puffer leer ist, bevor Sie ein Zeichen senden, verwenden Sie auch SerialReceive, das auf den Empfang eines Zeichens wartet.

Sie haben hier eine Kombination von Fehlern, in dem oben gezeigten Code lesen Sie zweimal und das zweite gelesene Byte ist fehlerhaft, was zu einem Empfangsüberlauf führt

Dann haben Sie selbst auf meinen Rat hin das RCREG gepuffert, danach haben Sie eine lange Verzögerung, aber der Empfangspuffer von UART kann nur ein Byte aufnehmen und alle anderen Bytes gehen verloren.

Verwenden Sie SerialReceive (das darauf wartet, dass ein Byte verfügbar ist, bevor es zurückkehrt, wie Sie oben sehen) und puffern Sie alle erwarteten Daten, bevor Sie eine Verarbeitung vornehmen:

for(i=0;i<number_of_bytes_expected;i++)
  {
   buffer[i] = SerialReceive();
  }
// do whatever you need with the data 
Danke. Ich werde das versuchen und euch wissen lassen, ob das funktioniert.
Ich habe es mit Puffer versucht, aber es bleibt immer noch beim ersten Byte hängen. (Können wir diese Konversation in den Chat verschieben?)
@prog_SAHIL Natürlich warte 30 min um an einen PC zu kommen, ich bin gerade am Handy