PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Utilisation Ibutton Dallas
Utilisation Ibutton Dallas
Iniciado por exotikarts, 05,jun. 2020 16:59 - 4 respuestas
Publicado el 05,junio 2020 - 16:59
Bonjour à tous,

Quelqu'un aurait un retour d'expérience pour contrôler et lire un Ibutton de chez Dallas ?

J'arrive à lire la rom ( identification ) mais pas plus...

Merci de vos retour.
Miembro registrado
948 mensajes
Publicado el 05,junio 2020 - 22:33
Bonsoir
- Auriez-vous un exemple de code en C, C++ ou C# ?
- Utiliseez-vous des API fourni avec un SDK ?
- Une documentation ?

--
« L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi
Miembro registrado
4 mensajes
Publicado el 05,junio 2020 - 22:47
Bonjour,
Après pas mal de tentatives et une lecture attentive de la documentation de l'API TMEX de Dallas et la DLL IBFS32.DLL,
https://files.maximintegrated.com/sia_bu/softdev/owdocs/Docs/TMEX/tmex3vlg.html
je suis arrivé à faire a peu près ce que je voulais, c'est à dire la gestion d'un iButton de type Thermocron.
Ci-après les procédures globales que j'ai écrites en ne garantissant pas à 100% l’absence de bugs ou certaines incohérences.

TMesure est une Structure
Horodatage est une DateHeure
Température est un numérique
FIN
TMission est une Structure
NuméroDeSérie est une chaîne // Numéro de série du composant sur 8 octets
HorlogeComposant est une DateHeure // Date et heure au moment de la lecture du composant
NonProgrammé est un booléen // Composant jamais utilisé ou hors service
NomComposant est une chaîne
DateProgrammation est une DateHeure // Top horaire de la programmation du début de mission
DateDébutMission est une DateHeure // Top horaire de la première mesure de la mission
DélaiAvantDébut est un entier // Délai entre la programmation de la mission et la première
// mesure. Adr 0x212 => pf, 0x213 => PF
DuréeMission est une Durée // Temps de mission total
TempsRestant est une Durée // Temps de mission restant
Température est un entier // Température actuelle lue
AlarmeBasse est un entier // Adr 0x20B => 0x00
AlarmeHaute est un entier // Adr 0x20C => 0xFF
RécurrenceMesure est entier // Adr 0x20D => Temps en minutes entre 2 mesures
NombreMesuresMission est un entier // Nombre de mesures effectuées depuis le début de la mission
NombreMesuresComposant est un entier // Nombre de mesures effectuées par le composant
EcrasementDonnées est un booléen // Rollover Adr 0x20E & 0x08 => Bit 3
AlarmeBasseActivée est un booléen // TLS Adr 0x20E & 0x04 => Bit 2
AlarmeHauteActivée est un booléen // THS Adr 0x20E & 0x02 => Bit 1
AlarmeTempsActivée est un booléen // TAS Adr 0x20E & 0x01 => Bit 0

AlarmeBasseDétectée est un booléen // TLF Adr 0x214 & 0x04 => Bit 2
AlarmeHauteDétectée est un booléen // THF Adr 0x214 & 0x02 => Bit 1
AlarmeTempsDétectée est un booléen // TAF Adr 0x214 & 0x01 => Bit 0
MissionEnCours est un booléen // MIP Adr 0x214 & 0x20 => Bit 5

Relevé est un tableau de 2049 TMesure
Histogramme est un tableau de 64 entiers
FIN



PROCÉDURE BufferToHexa(LOCAL Buffer est tableau d'entier, Longueur est entier, Format est un entier = 2, LongLigne est un entier = 16, LOCAL AfficheAdresse est un entier = -1, FormatAdresse est un entier = 4)

sRes est une chaîne

SI Format <> 0 ET Format <> 2 ET Format <> 4 ALORS
Format = 2
FIN
SI AfficheAdresse >= 0 ALORS
sRes = Droite(EntierVersHexa(AfficheAdresse), FormatAdresse) + " - "
AfficheAdresse += LongLigne
FIN

POUR i = 1 À Longueur
sRes += Droite(EntierVersHexa(Buffer[i]), Format)
SI modulo(i, LongLigne) = 0 ALORS
sRes += CR
SI AfficheAdresse >= 0 ALORS
sRes += Droite(EntierVersHexa(AfficheAdresse), FormatAdresse) + " - "
AfficheAdresse += LongLigne
FIN
SINON
SI Format > 0 ALORS
sRes += " "
FIN
FIN
FIN
RENVOYER sRes



PROCÉDURE ChargeDallasDLL() : booléen

Res est un entier
//gDallasdll = SysRep(srSystème) + "\IBFS32.DLL"
SI gDallasdll = "" ALORS
gDallasdll = "IBFS32.DLL"
SI ChargeDLL(gDallasdll) = 0 ALORS
gDallasdll = ""
SINON
// https://files.maximintegrated.com/sia_bu/softdev/owdocs/Docs/TMEX/tmex3vlg.html
Res = AppelDLL32(gDallasdll,"TMReadDefaultPort", &gPortLecteur, &gnTypeport)
SI Res <> 1 ALORS
gPortLecteur = 1
gnTypeport = 6
FIN
FIN
FIN
RENVOYER gDallasdll <> ""

//Procédure ConvertCHHEX()
FONCTION ConvertCHHEX(Ch) : entier

i est un entier
ChTemp est une chaîne
Res est un entier

POUR i = 1 À Taille(Ch)
SI 48 <= Asc(Ch[[i]]) ET Asc(Ch[[i]]) <= 57 ALORS
ChTemp = Ch[[i]]
SINON
ChTemp = NumériqueVersChaîne(Asc(Majuscule(Ch[[i]])) - 65 + 10,"2d")
FIN
Res = Res + Val(ChTemp)*Puissance(16,(Taille(Ch) - i))
FIN

RENVOYER Res


PROCÉDURE StartSession() : booléen

Res est un entier = AppelDLL32(gDallasdll,"TMExtendedStartSession", gPortLecteur, gnTypeport, Null)
SI Res > 0 ALORS
SessionHandle = Res
SINON
SessionHandle = 0
FIN
RENVOYER Res > 0

PROCÉDURE EndSession()

Res est un entier = AppelDLL32(gDallasdll,"TMEndSession", SessionHandle)
SessionHandle = 0
RENVOYER Res = 1

PROCÉDURE PortSetUp() : booléen

Res est un entier = AppelDLL32(gDallasdll, "TMSetup", SessionHandle)
RENVOYER Res = 1

PROCÉDURE PortClose()

Res est un entier = AppelDLL32(gDallasdll, "TMClose", SessionHandle)
RENVOYER Res= 1

PROCÉDURE LectureDateHeure() : DateHeure

SI SélectionComposant(ROM) ALORS
LocalBuffer est un tableau de 7 entiers sur 2 octets
LectureMémoire(0x200, 7, LocalBuffer, Vrai)
//PortClose()
//EndSession()
RENVOYER BufferVersDateHeure(LocalBuffer)
SINON
RENVOYER "00000000"
FIN

PROCÉDURE BufferVersDateHeure(Buffer) : DateHeure

Secondes est un entier = (Buffer[1] & 0x0F) + 10 * (bitDécaleDroite(Buffer[1], 4) & 0x07)
Minutes est un entier = (Buffer[2] & 0x0F) + 10 * (bitDécaleDroite(Buffer[2], 4) & 0x07)
Heures est un entier
SI Buffer[2] & 0x40 = 0 ALORS
// Mode 24 h
Heures = (Buffer[3] & 0x0F) + 10 * (bitDécaleDroite(Buffer[3], 4) & 0x03)
SINON
// Mode AM/PM
Heures = (Buffer[3] & 0x0F) + 10 * (bitDécaleDroite(Buffer[3], 4) & 0x01)
SI Buffer[2] & 0x20 = 0x20 ALORS
// Si PM on ajoute 12 à l'heure calculée
Heures += 12
FIN
FIN
JSemaine est un entier = (Buffer[4] & 0x07)
LeJour est un entier = (Buffer[5] & 0x0F) + 10 * (bitDécaleDroite(Buffer[5], 4) & 0x03)
Mois est un entier = (Buffer[6] & 0x0F) + 10 * (bitDécaleDroite(Buffer[6], 4) & 0x01)
Année est un entier= 2000 + (Buffer[7] & 0x0F) + 10 * (bitDécaleDroite(Buffer[7], 4) & 0x0F)
// AAAAMMJJHHMMSS
LaDate est une DateHeure = NumériqueVersChaîne(Année, "04d") + NumériqueVersChaîne(Mois, "02d") + NumériqueVersChaîne(LeJour, "02d") +
NumériqueVersChaîne(Heures, "02d") + NumériqueVersChaîne(Minutes, "02d") + NumériqueVersChaîne(Secondes, "02d")
RENVOYER LaDate

PROCÉDURE LectureMémoire(Adr est entier, Longueur est entier, BufferMémoire est tableau d'entiers sur 2 octets, SkipROM est un booléen = Vrai) : booléen

SI Longueur > 2048 ALORS
Longueur = 2048
FIN
BufferLocal est un tableau de 4 entiers sur 2 octets
POUR i = 1 À 4 BufferLocal[i] = 0xFF
ix est un entier = 1
SI SkipROM ALORS
BufferLocal[ix] = 0xCC // Skip ROM Command
ix++
FIN
BufferLocal[ix] = 0xF0 // Read Memory Command
ix++
BufferLocal[ix] = Adr & 0xFF // Poids faible adresse
ix++
BufferLocal[ix] = bitDécaleDroite(Adr, 8) & 0xFF // Poids fort adresse

POUR i = 1 À ix
SI AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, BufferLocal[i]) <> BufferLocal[i] ALORS
RENVOYER Faux
SORTIR
FIN
FIN
POUR i = 1 À Longueur
BufferMémoire[i] = AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0xFF)
FIN
RENVOYER Vrai

PROCÉDURE OctetVersTempérature(LOCAL OctTemp est un entier, TempRange = "G") : numérique

SELON TempRange
CAS "H"
RENVOYER OctTemp / 8 + 14.5
CAS "Z"
RENVOYER OctTemp / 8 - 5.5
AUTRE CAS // "G"
RENVOYER OctTemp / 2 - 40
FIN

PROCÉDURE TempératureVersOctet(LOCAL Temp est un numérique, TempRange = "G") : entier

TOct est un entier
SELON TempRange
CAS "H"
TOct = Arrondi(Temp * 8) - 116
CAS "Z"
TOct = Arrondi(Temp * 8) + 44
AUTRE CAS
TOct = Arrondi(Temp * 2) + 80
FIN

SI TOct < 0 ALORS
TOct = 0
SINON
SI TOct > 0xFA ALORS
TOct = 0xFA
FIN
FIN
RENVOYER TOct

PROCÉDURE LectureTempérature()

OctTemp est un tableau de 2 entiers sur 2 octets

SI SélectionComposant(ROM) ALORS
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0xCC) // Skip ROM Command
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0x44) // Convert Temperature Command
Temporisation(10)
AppelDLL32(gDallasdll, "TMTouchReset", SessionHandle)
LectureMémoire(0x211, 1, OctTemp, Vrai)
//PortClose()
//EndSession()
RENVOYER OctetVersTempérature(OctTemp[1], NuméroSérieVersTempRange(ROM))
SINON
RENVOYER -127
FIN


PROCÉDURE SélectionComposant(NuméroSérie est un tableau de 8 entiers sur 2 octets) : booléen
LocROM est un tableau de 8 entiers sur 2 octets

SI SessionValide() = Faux ALORS
SI StartSession() = Faux ALORS
Info("Ouverture du port impossible")
RENVOYER Faux
FIN

SI SessionHandle < 1 ALORS
Info("Session non valide")
RENVOYER Faux
FIN
FIN

SI PortSetUp() = Faux ALORS
Info("Ouverture du port impossible")
RENVOYER Faux
FIN

Res est entier = AppelDLL32(gDallasdll,"TMTouchReset", SessionHandle)
SI Res <> 1 ET Res <> 2 ALORS
Info("Pas de composant sur le bus")
RENVOYER Faux
FIN

Res = AppelDLL32(gDallasdll, "TMRom", SessionHandle, &StateBuffer, &NuméroSérie)
SI Res <> 1 ALORS
Info("Composant sélectionné non présent sur le bus")
RENVOYER Faux
FIN

Res = AppelDLL32(gDallasdll,"TMTouchReset", SessionHandle)
LocROM[1] = 0
Res = AppelDLL32(gDallasdll, "TMRom", SessionHandle, &StateBuffer, &LocROM)
RENVOYER Res = 1 OU Res = 2

PROCÉDURE SessionValide() : booléen

RENVOYER SessionHandle > 0

PROCÉDURE EcritureMémoire(Adr est entier, Longueur est un entier, Données est un tableau d'entiers sur 2 octets, Contrôle est un booléen = Vrai) : booléen

SI SélectionComposant(ROM) = Faux ALORS
RENVOYER Faux
FIN
LocalBuffer est tableau de 40 entiers sur 2 octets

// Write Scratchpad Command = 0x0F
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0xCC) // Skip ROM Command
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0x0F) // Write Scratchpad Command
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, Adr & 0xFF) //
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, bitDécaleDroite(Adr, 8) & 0xFF) //
POUR i = 1 À Longueur
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, Données[i])
FIN

// Read Scratchpad Command = 0xAA
AppelDLL32(gDallasdll, "TMTouchReset", SessionHandle)
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0xCC) // Skip ROM Command
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0xAA) // Read Scratchpad Command
POUR i = 1 À Longueur + 3
LocalBuffer[i] = AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0xFF)
Err est un booléen
SELON i
CAS 1: Err = LocalBuffer[i] <> Adr & 0xFF
CAS 2: Err = LocalBuffer[i] <> bitDécaleDroite(Adr, 8) & 0xFF
CAS 3: Err = Faux
AUTRE CAS: Err = LocalBuffer[i] <> Données[i - 3]
FIN
SI Err ALORS
RENVOYER Faux
FIN
FIN

// Copy Scratchpad Command = 0x55
AppelDLL32(gDallasdll, "TMTouchReset", SessionHandle)
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0xCC) // Skip ROM Command
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0x55) // Copy Scratchpad Command
POUR i = 1 À 3
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, LocalBuffer[i]) // Authorization code
FIN
AppelDLL32(gDallasdll, "TMTouchReset", SessionHandle)

Temporisation(1)

SI Contrôle ALORS
AppelDLL32(gDallasdll, "TMTouchReset", SessionHandle)
POUR i = 1 À 40 LocalBuffer[i] = 0xFF
LectureMémoire(Adr, Longueur, LocalBuffer, Vrai)
POUR i = 1 À Longueur
SI LocalBuffer[i] <> Données[i] ALORS
RENVOYER Faux
FIN
FIN
FIN

RENVOYER Vrai
PROCÉDURE DateHeureVersBuffer(LOCAL Top est une DateHeure, Buffer est tableau d'entiers sur 2 octets)

Secondes est un entier = modulo(Top..Seconde, 10) + 16 * ArrondiInférieur(Top..Seconde / 10)
Minutes est un entier = modulo(Top..Minute, 10) + 16 * ArrondiInférieur(Top..Minute / 10)
Heures est un entier = modulo(Top..Heure, 10) + 16 * ArrondiInférieur(Top..Heure / 10)
JSemaine est un entier = DateVersJour(Top)
LeJour est un entier = modulo(Top..Jour, 10) + 16 * ArrondiInférieur(Top..Jour / 10)
Mois est un entier = modulo(Top..Mois, 10) + 16 * ArrondiInférieur(Top..Mois / 10)
Année est un entier = modulo((Top..Année - 2000), 10) + 16 * ArrondiInférieur((Top..Année - 2000) / 10)
// AAAAMMJJHHMMSS
Buffer[1] = Secondes
Buffer[2] = Minutes
Buffer[3] = Heures
Buffer[4] = JSemaine
Buffer[5] = LeJour
Buffer[6] = Mois
Buffer[7] = Année

PROCÉDURE EffacementMémoire() : booléen

LocalBuffer est un tableau de 8 entiers sur 2 octets
LocalBuffer[1] = 0x40
SI EcritureMémoire(0x20E, 1, LocalBuffer, Faux) = Faux ALORS
RENVOYER Faux
FIN

SI PrésenceComposant() ALORS
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0xCC) // Skip ROM Command
AppelDLL32(gDallasdll, "TMTouchByte", SessionHandle, 0x3C) // Clear Mamory Command
RENVOYER PrésenceComposant()
SINON
RENVOYER Faux
FIN

PROCÉDURE PrésenceComposant()

Res est entier = AppelDLL32(gDallasdll,"TMTouchReset", SessionHandle)
RENVOYER Res = 1

PROCÉDURE RAZMission(Miss est TMission)
AVEC Miss
.AlarmeBasse = 0
.AlarmeBasseActivée = Faux
.AlarmeBasseDétectée = Faux
.AlarmeHaute = 0
.AlarmeHauteActivée = Faux
.AlarmeHauteDétectée = Faux
.AlarmeTempsActivée = Faux
.AlarmeTempsDétectée = Faux
.DateDébutMission = Null
.DateProgrammation = Null
.DélaiAvantDébut = 0
.EcrasementDonnées = Faux
POUR i = 1 À Dimension(.Histogramme)
.Histogramme[i] = 0
FIN
.HorlogeComposant = Null
.MissionEnCours = Faux
.NombreMesuresComposant = 0
.NombreMesuresMission = 0
.NomComposant = ""
.NonProgrammé = Vrai
.NuméroDeSérie = ""
.RécurrenceMesure = 0
.Température = Null
POUR i = 1 À Dimension(.Relevé)
.Relevé[i].Température = Null
.Relevé[i].Horodatage = Null
FIN
FIN


PROCÉDURE LectureStatus(Mission)
Buf est un tableau de 256 entiers sur 2 octets
Res est un booléen = Faux

// Lecture status
SI SélectionComposant(ROM) ALORS
Res = LectureMémoire(0x200, 32, Buf, Vrai)
FIN

SI Res ALORS
Mission.MissionEnCours = Buf[0x14+1] & 0x20 = 0x20
Mission.AlarmeBasseDétectée = Buf[0x14+1] & 0x04 = 0x04
Mission.AlarmeHauteDétectée = Buf[0x14+1] & 0x02 = 0x02
Mission.AlarmeTempsDétectée = Buf[0x14+1] & 0x01 = 0x01
Mission.NombreMesuresMission = Buf[0x1A+1] + Buf[0x1B+1]*0x100 + Buf[0x1C+1]*0x10000
Mission.NombreMesuresComposant = Buf[0x1D+1] + Buf[0x1E+1]*0x100 + Buf[0x1F+1]*0x10000
Mission.RécurrenceMesure = Buf[0x0D+1]
Mission.DuréeMission..EnMinutes = Mission.RécurrenceMesure * 2048
Mission.DélaiAvantDébut = Buf[0x12+1] + Buf[0x13+1]*0x100

MTimestamp est un tableau de 7 entiers sur 2 octets
MTimestamp[1] = 0
MTimestamp[2] = Buf[0x15+1] & 0x7F
MTimestamp[3] = Buf[0x16+1] & 0x3F
MTimestamp[4] = 1
MTimestamp[5] = Buf[0x17+1] & 0x3F
MTimestamp[6] = Buf[0x18+1] & 0x1F
MTimestamp[7] = Buf[0x19+1] & 0xFF
Mission.DateDébutMission = BufferVersDateHeure(MTimestamp)
Mission.EcrasementDonnées = Buf[0x0E+1] & 0x08 = 0x08
Mission.AlarmeBasse = OctetVersTempérature(Buf[0x0B+1], NuméroSérieVersTempRange(ROM))
Mission.AlarmeHaute = OctetVersTempérature(Buf[0x0C+1], NuméroSérieVersTempRange(ROM))
Mission.AlarmeBasseActivée = Buf[0x0E+1] & 0x04 = 0x04
Mission.AlarmeHauteActivée = Buf[0x0E+1] & 0x02 = 0x02
Mission.AlarmeTempsActivée = Buf[0x0E+1] & 0x01 = 0x01
SI Mission.NombreMesuresMission > 2048 ALORS
Mission.TempsRestant..EnMinutes = Null
SINON
Mission.TempsRestant..EnMinutes = (2048 - Mission.NombreMesuresMission) * Mission.RécurrenceMesure
FIN
FIN
PROCÉDURE LectureHistogramme(Mission)

Buf est un tableau de 256 entiers sur 2 octets
SI SélectionComposant(ROM) = Faux ALORS
RETOUR
FIN
LectureMémoire(0x800, 128, Buf, Vrai)
POUR i = 0 À 62
Mission.Histogramme[i + 1] = Buf[2*i + 1] + Buf[2*i + 2]*0x100
FIN
PROCÉDURE LectureNomComposant(Mission)

Buf est un tableau de 32 entiers sur 2 octets
Mission.NomComposant = ""
SI SélectionComposant(ROM) = Faux ALORS
RETOUR
FIN
SI LectureMémoire(0x100, 32, Buf, Vrai) ALORS
LeMessage est une chaîne
POUR i = 1 À 32
SI Buf[i] = 0 ALORS
SORTIR
FIN
LeMessage += Caract(Buf[i] & 0xFF)
FIN
Mission.NomComposant = LeMessage
FIN

PROCÉDURE MiseHeure(Top est une DateHeure)
BuffTime est un tableau de 7 entiers sur 2 octets
DateHeureVersBuffer(Top, BuffTime)
EcritureMémoire(0x200, 7, BuffTime, Vrai)
BuffTime[1] = 0x80
EcritureMémoire(0x20E, 1, BuffTime, Faux)
BuffTime[1] = 0x40
EcritureMémoire(0x20E, 1, BuffTime, Faux)


PROCÉDURE PrépareMission(Miss est TMission) : booléen
Buff est un tableau de 7 entiers sur 2 octets
Res est un booléen

Buff[1] = 0x00
SI Miss.AlarmeBasseActivée ALORS
Buff[1] += 4
FIN
SI Miss.AlarmeHauteActivée ALORS
Buff[1] += 2
FIN
SI Miss.AlarmeTempsActivée ALORS
Buff[1] += 1
FIN
SI Miss.EcrasementDonnées ALORS
Buff[1] += 8
FIN

Buff[2] = 0x00
Buff[3] = 0x00
Buff[4] = 0x00
Buff[5] = Miss.DélaiAvantDébut & 0xFF // Start Delay Low Byte
Buff[6] = bitDécaleDroite(Miss.DélaiAvantDébut, 8) & 0xFF // Start Delay High Byte
Buff[7] = 0x00

Res = EcritureMémoire(0x20E, 7, Buff, Faux)
RENVOYER Res

PROCÉDURE ProgrammationSeuilsAlarmes(Miss est TMission) : booléen
Buff est un tableau de 2 entiers sur 2 octets
Res est un booléen

Buff[1] = TempératureVersOctet(Miss.AlarmeBasse)
Buff[2] = TempératureVersOctet(Miss.AlarmeHaute)
Res = EcritureMémoire(0x20B, 2, Buff, Vrai)

RENVOYER Res

PROCÉDURE DémarrageMission(Miss est TMission) : booléen

LMission est TMission
Buff est un tableau de 2 entiers sur 2 octets
Res est un booléen
Buff[1] = Miss.RécurrenceMesure
Res = EcritureMémoire(0x20D, 1, Buff, Vrai)
SI Res ALORS
LectureStatus(LMission)
Res = LMission.MissionEnCours
FIN

RENVOYER Res

PROCÉDURE EcritureNomComposant(Mission)

Buf est un tableau de 32 entiers sur 2 octets
SI Taille(Mission.NomComposant) > 31 ALORS
Mission.NomComposant = Gauche(Mission.NomComposant, 31)
FIN
POUR i = 1 À Taille(Mission.NomComposant)
Buf[i] = Asc(Mission.NomComposant[i])
FIN
POUR i = Taille(Mission.NomComposant) + 1 À 32
Buf[i] = 0
FIN

SI SélectionComposant(ROM) ALORS
RENVOYER EcritureMémoire(0x100, 32, Buf, Vrai)
SINON
RENVOYER Faux
FIN


PROCÉDURE StopMission(Miss est TMission) : booléen

Buff est un tableau de 2 entiers sur 2 octets
Res est un booléen
Buff[1] = 0
Res = EcritureMémoire(0x20D, 1, Buff, Vrai)
SI Res ALORS
LectureStatus(Miss)
Res = Miss.MissionEnCours = Faux
FIN

RENVOYER Res



PROCÉDURE NuméroSérieVersTempRange(Serial est un tableau de 8 entiers sur 2 octets) : chaîne

TempRangeCode est entier = Serial[7] * 16 + (bitDécaleDroite(Serial[6], 4) & 0x0F)
SELON TempRangeCode
CAS 0x4F2
RENVOYER "H"
CAS 0x3B2
RENVOYER "Z"
AUTRE CAS
RENVOYER "G"
FIN
Miembro registrado
4 mensajes
Publicado el 05,junio 2020 - 23:07
Envoyer des centaines de ligne de code au travers du forum n'est pas la panacée, je veux bien partager mon projet complet mais je ne sais pas comment faire ?
Publicado el 06,junio 2020 - 14:06
Déjà un grand merci Renco, je vais tester tout cela !
Pour ma part je n'avais pas réussis à aller plus loin que lire l'adresse Rom...

Et pour le projet voici mon adresse exotikom@gmail.com mail si nous pouvions correspondre par E-mail,
je en remercie d'avance.