Bonjour,
J'essaie de créer un petit boitier avec 2 ports série (1 in et 1 out). Ce boitier à pour but de s'intercaler entre 2 appareils (1 automate et 1 appareil à piloter en port série(vidéoprojecteur, écran, ici nous prendrons VP pour vidéoprojecteur) dans le cas ou le VP à piloter est remplacé par un autre modèle qui ne comporte pas les même codes de pilotage. Pour pouvoir modifier les codes à comparer entre l'ancien et le nouveau modèle, un fichier texte sur la carte SD est nécessaire. La structure d'une ligne dans ce fichier est celle ci :
command \x0D*pow=on#\x0D = PWR ON
Pour mes test j'utilise un automate qui envoi par exemple le code
\x0D*pow=on#\x0D
Les \x indiquent à l'automate qu'il doit envoyer de l'hexa si pas \x il considère que c'est de l'ASCII.
A partir des exemples ci-dessus l'ancien VP nécessite la commande \x0D*pow=on#\x0D pour s'allumer, le nouveau nécessite PWR ON
J'arrive en string à lire les valeurs reçues les comparer et les renvoyer. La où je bute c'est pour lire les valeurs hexadécimal.
Avec le code ci-dessous si l'automate envoi \x0D*pow=on#\x0D j'obtiens dans le Serial.print les bonnes valeurs hexa à l'exception du \x0D soit 0x0D de début et de fin. Voici le code dans le print :
D 2A 70 6F 77 3D 6F 6E 23 D 0
Le D du début devrait être précédé d'un 0 et les 2 derniers devrait être 0D et non D0.
Mon code vous semblera surement très brouillon, je suis débutant et j'assemble des morceaux de code étape par étape pour arriver à mes fins. (Il n'y a pas la totalité du code, la suite concerne la comparaison avec le fichier texte et pour le moment mon problème concerne le print à réception).
#include <SdFat.h>
#include <SPI.h>
String Answer;
String keyword;
String commanderecue;
long aLong;
SdFat sd;
SdFile file;
const size_t LINE_DIM = 100; // Maximum line length plus space for zero byte
char line[LINE_DIM];
File myFile;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial1.begin(9600);
Serial1.print("Connected to arduino1!");
Serial2.begin(38400,SERIAL_8N1);
Serial2.print("Connected to PC!");
Serial1.print("Initializing SD card...");
if (!sd.begin(4, SPI_FULL_SPEED)) {
Serial1.println("initialization failed!");
while (1);
}
Serial1.println("initialization done.");
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
// myFile = SD.open("test.txt", FILE_WRITE);
}
void loop() {
if(Serial1.available()>0)
{
keyword = Serial1.readStringUntil('\n');
String str = keyword;
int str_len = str.length() + 1;
char char_array[str_len];
str.toCharArray(char_array, str_len);
for (byte i = 0; i < str_len; i = i + 1) {
aLong = strtol(char_array[0], NULL, 16);
Serial.print(char_array[i], HEX);
Serial.print("\t");
}
Une fois le problème résolu, j'aimerai discuter du fait de se passer des string, j'ai lu qu'il pouvait raccourcir la vie de l'Arduino en causant des problèmes mémoires. Mais je ne sais pas par où commencer pour supprimer la partie String.
Merci pour votre aide, la recherche google ne m'a pas permis de trouver de réponse à ce problème, 2 soirs (nuits) que je suis dessus.