0
votes

Comment ajouter et afficher des heures, des minutes, des secondes de données extraites du port série avec la programmation C

J'ai pris des données de température du port série Arduino. Les données de température sortant du moniteur série Arduino sont les suivantes: xxx pré>

à l'aide du programme C pour lire le port série ci-dessous. Code: p> xxx pré>

alors il apparaît comme ça. p> xxx pré>

maintenant je veux ajouter et afficher des heures, des minutes et des minutes secondes à l'aide du programme C comme le code ci-dessous: p> xxx pré>

mais le résultat est comme ceci: p> xxx pre>

i Le résultat est P>

21.48,18:9:38
21.97,18:9:38
21.48,18:9:38
21.00,18:9:38
21.97,18:9:38
21.97,18:9:38


0 commentaires

3 Réponses :


1
votes

donc l'Arduino envoie une nouvelle ligne? Ensuite, collectez les caractères que vous avez lus dans une chaîne et une affichage (avec le temps) lorsque vous avez lu la nouvelle ligne.


1 commentaires

.Merci. Mon code de programme Arduino est Température flottante; int A = 0; void configuration () {série.begin (9600); } Void Boucle () {Température = AnalogRead (A); température = température * (5.0 * 100.0 / 1024.0); Série.println (température); retard (1000); }



2
votes

Vous lisez le caractère de données de température par caractère. Vous devez donc détecter, dans ce flux de caractères, où sont les limites de chaque paquet de données. Évidemment, il y a des caractères de rupture de ligne contenus, vous devez donc les détecter:

if(tempChar == '\n')
{
    // print separator and date/time
}
printf("%c", TempChar)


12 commentaires

Merci pour le conseil, et j'ai essayé avec le code est si (TempChar == '\ r') {Printf (",% D:% D:% D", Str_T.whour + 7, Str_T. wminute, str_t.wsecond); } printf ("% c", tempchare); et la sortie est | 28., 19: 23: 36 | | 28.32,19: 23: 36 | | 28.32,19: 23: 36 | | 28.32,19: 23: 36 | | 28.32,19: 23: 36 | | 28.32,19: 23: 36 | | 28.32,19: 23: 36 |


Que dois-je faire si je veux enregistrer dans un fichier avec la syntaxe Fprintf?


@Zacknov qui ne différerait pas - seuls que vous fourniriez un paramètre de fichier supplémentaire: fichier * fichier = fopen ("chemin / ou fichier / fichier /", "w"); fprintf (fichier, "% c", tmpchar); - vous devez vérifier le paramètre de fichier (NULL, si vous ouvrez le fichier échoue), ou peut-être préférez-vous ajouter au lieu de remplacer (puis utilisez-vous. "A" comme deuxième paramètre).


Je pense que comment combiner des heures, des minutes, des secondes avec des données de la série. Heures de données, minutes, secondes peut être effectuée en 1 variable, puis sur quoi des données série sorties par caractère et enregistrez dans un fichier?


@Zacknov ne peut pas vraiment suivre. Voulez-vous stocker la même sortie que vous avez imprimée sur la console dans un fichier? Ensuite, vous pouvez continuer comme avant, écrivez le caractère par caractère dans le fichier et sur la réception de \ r , vous ajoutez des informations de temps, comme vous l'avez fait auparavant. Ou voulez-vous réellement travailler avec les données reçues, e. g. calculer une moyenne sur une certaine durée?


Je souhaite stocker la sortie mon imprimée sur la console dans un fichier, comme le 28.32,19: 23: 36. Seul magasin, pas de calcul,


@Zacknov puis revenez à mon commentaire original, remplace simplement vos appels sur printf avec ceux à fprintf et n'oublie pas le paramètre supplémentaire ...


Enfin, écrivez avec succès dans le fichier en suivant vos instructions et vos suggestions. Cela fait 2 jours d'essayer de pouvoir enregistrer dans un fichier. La prochaine étape Je vais essayer de saisir les données dans MySQL.


@Zacknov dans des bases de données ne stockez pas les données numériques comme chaînes, utilisez les types fournis. Personnellement, je préférerais les types de données intégrés, stockant 100% de degrés (vous pouvez ajouter le point décimal plus tard lors de l'impression). De plus, il devrait y avoir un type d'horodatage approprié. Devrait même être possible de Laissez la base de données Déterminer l'horodatage automatiquement . De cette façon, vous auriez besoin de calculer la date / heure dans le format que vous désirez plus tard, mais ce n'est pas trop de problème ...


Oui, modifier les données de température de TempCal de l'Arduino dans la chaîne à flotter pour faire correspondre le type de données MySQL n'a pas réussi.


@ZackNOV Avez-vous un nombre corrigé de décimales (au moins au moins) - si oui, écrivez tous les chiffres dans un réseau de caractères de longueur suffisante (je suppose que 8 ou 16 caractères devraient toujours suffire). Passer le point décimal. Si le nombre de chiffres après le point décimal est variable, alors lorsque vous le passez, commencez à compter des chiffres et appendez des zéros si vous n'avez pas eu suffisamment de chiffres. Puis convertir en nombre, e. g. Utilisation de strtoul - et vous avez déjà un numéro agréable à stocker, en fonction du nombre de décimales en 10ème, 100e ou 1000ème de degrés (je suppose que vous utiliseriez 100ème de).


Les nombres de points fixes (e. G. 100ths de degrés) sont généralement supérieurs aux nombres de points flottants, à condition que vous n'ayez pas besoin de précision variable. Les types de données de points flottants ne peuvent pas représenter avec précision même de tels nombres simples tels que 0,1 (périodique en binaire ...).



1
votes

Cette erreur arrive à cause de la façon dont vous avez écrit l'instruction d'impression.

do{
   ReadFile(hComm,&TempChar,sizeof(TempChar),&NoBytesRead,NULL);
   if(TempChar!='\n'){printf("%c",TempChar);}
   else{
        printf(", %d:%d:%d \n",str_t.wHour+7,str_t.wMinute,str_t.wSecond);}
}while(!kbhit());


4 commentaires

Merci. J'ai essayé le code que vous avez donné, les données de température n'apparaissaient pas et les résultats étaient: | , 19:43:25 | | , 19:43:25 | | , 19:43:25 | | , 19:43:25 | | , 19:43:25 | | , 19:43:25 | | , 19:43:25 |


Vérifiez que la ligne se casse correctement une fois. L'extrait de code que j'ai fourni est selon ma compréhension des données. L'idée reste toutefois ce que j'ai proposé - "d'abord imprimer les données de la température et dès que vous atteignez la fin de celui-ci, imprimez l'heure actuelle". Vous devrez peut-être modifier le code en fonction des données.


Il a eu du succès, apparemment en remplaçant TempChar! = '\ N' avec tempchare! = '\ R'


Ohkay! Cool. Si la réponse vous a aidé à résoudre le problème, vous pouvez l'accepter.