|
| 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, & 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 * - 116 CAS "Z" TOct = Arrondi(Temp * + 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, & 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, & 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, & 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. |
| |
| |
| | | |
|
| | | | |
| | |
|