Ecrire un fichier dans une memoire par le port serie
cs_buldo
Messages postés14Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention28 avril 2013
-
28 avril 2013 à 00:47
Utilisateur anonyme -
5 mai 2013 à 02:14
Bonjour,
J'arrive lentement à écrire un fichier (2000 ko en .bin) dans une memoire connecté à un microcontroleur sur le port série avec ce code
procedure TForm1.ButtonOuvrirClick(Sender: TObject);
var fichier: file of byte;
L,i,row,col,DbutAdr,Nb_BYT,Num_Adr,long :integer;
UnByte, TestByte:byte;
S,n:string;
carac:char;
Label erreur , ok , fin ;
begin
if opendialog1.execute then
assignfile(Fichier,opendialog1.filename);
reset(Fichier);
ComPort1.WriteStr('e');
sleep(10);
while not eof(Fichier) do begin
read(Fichier,Unbyte);
Comport1.ClearBuffer(True,False);
erreur:
ComPort1.Write(UnByte,1);
long:= ComPort1.Read(TestByte,1);
if TestByte <> UnByte then goto erreur ;
end;
closefile(fichier); // Fermer le fichier
end;
en effet j'ecrit octet par octet. J'aimerais l'envoyer par groupe de 16 octets mais il y une panne, seul les 16 premiers octets s'écrivent et se répète dans la mémoire. est-elle dans se code ou sur mon programme Picaxe ??
procedure TForm1.ButtonOuvrirClick(Sender: TObject);
var fichier: file of byte;
L,i,row,col,DbutAdr,Nb_BYT,Num_Adr,long :integer;
UnByte, TestByte: array[0..15] of byte;
S,n:string;
carac:char;
Label erreur , ok , fin ;
begin
if opendialog1.execute then
assignfile(Fichier,opendialog1.filename);
reset(Fichier);
ProgressBarEcrire.Position := 0;
ProgressBarEcrire.Min := 0;
ProgressBarEcrire.Max := 118640 ;
row := 0 ;
ComPort1.WriteStr('e');
sleep(10);
repeat
row := row + 16 ;
ProgressBarEcrire.Position := row ;
BlockRead(Fichier,Unbyte,16,L);
Comport1.ClearBuffer(True,False);
erreur:
ComPort1.Write(UnByte[0],16);
long:= ComPort1.Read(TestByte[0],16);
for i:=0 to 16 do ;
begin
if TestByte [i] <> UnByte [i] then goto erreur ;
end;
until L =0;
closefile(fichier); // Fermer le fichier
end;
merci d'avance pour vos solutions
A voir également:
Ecrire un fichier dans une memoire par le port serie
cs_buldo
Messages postés14Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention28 avril 2013 28 avril 2013 à 01:36
J'ai pas trouvé le bouton edit ...
En fait même le premier code me donne aussi des erreurs d'écriture après relecture de la mémoire, va falloir que je développe un dialogue de gestion d'erreur entre le pc et le picaxe. Mais là je vais faire dodo ...
if opendialog1.execute then
Begin
assignfile(Fichier,opendialog1.filename);
reset(Fichier);
//Tout le reste du code
End;
En effet si execute renvoit faux la ligne qui suit est zappé mais pas le reste. Bilan beug assuré .
2)Ensuite tu dis que ton code est lent : Cela est normal et pour deux raisons. Déjà tu utilises une technique qui n'est plus d'actualité (Block). Et surtout tu lis ton fichier byte à byte : cela revient à vouloir remplir une baignoire au goutte à goutte .
Pourquoi ne pas simplement utiliser un stream (TMemoryStream) et ensuite envoyer ce dernier dans ton TComport.
3)
sleep(10);
Cela n'a aucun intéret surtout vu la valeur rentrée (on ne peut pas descendre en dessous de 17ms).
4)C'est quoi ce goto ? On dirait BruNews . Delphi est tel que cette instruction n'a plus à être utilisée.
5)Tu essayes d'ecrire et de lire dans ton TComport ? Le probleme est que tu le fais sans aucune vérification : Bilan si l'envoi n'est pas fini il se passe quoi ? De plus pour récupérer quelque chose faut il encore que des données soient envoyées à ton Pc (Est ce le cas ?).