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.
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:
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
Dorian
prog_SAHIL
Dorian
prog_SAHIL
Dorian