Pb de code ASCII entre un PC et Arduino

Je voudrais pouvoir utiliser le sujet suivant:

Sur le site :

Le port COM4 s'ouvre, la liaison s'établit mais les caractères pour l'identification transmis ne sont pas les caractères attendus.

En mettant des lcd.print dans la fonction, pour le suivi, j'ai un cractère proche de "Þ" (ALT 232 ou 222 ou..) au lieu d'un "#" ALT 34. Impossible de le reproduire sur l'afficheur a coté de celui affiché.

Si j'affiche avec un lcd.print("Þ") c'est différent de lcd.print('Þ') et encore différent avec lcd.write("Þ") et encore avec lcd.write('Þ').
Si je tente d'identifier en explorant les différents cas, je vais y passer plus d'une journée sans même savoir si c'est correcte.

Quel est le code ASCII utilisé ?
par Visual Studio
par l'USB
par Arduino
par l'afficheur CP850

Comment satisfaire les condition des if coté Arduino et en retour coté PC. Etonnant! non?

Merci de m'aider, je suis très perplexe.

cordialement mandrain

Salut, tu t'emballe un peut trop sur ton problème de caractère etc, regarde du côté de la vitesse de ta liaison série je pense que c'est la que ce situe ton problème.

Skizo.

Salut,

mandrain:
Si j'affiche avec un lcd.print("Þ") c'est différent de lcd.print('Þ') et encore différent avec lcd.write("Þ") et encore avec lcd.write('Þ').

Et oui les guillemets ne font pas la même chose que des apostrophes et print() c'est pas write(). Mais en mixant les bonnes choses on peut faire la même chose qu'une autre.

Il n'y a pas des codes ASCII, il y a un code ASCII et c'est tout, tout dépend ensuite de comment tu gères la discussions. Si tu parles en français à un allemand c'est sûr que ça marchera pas, tout comme l'inverse. Mais un allemand qui va parler couramment français ça marchera, de même qu'un allemand lisant phonétiquement du français sera compris par le français mais sera incapable de comprendre la réponse en français ...

La liaison série c'est que des nombres de 0 à 255. Si maintenant on dit que tel numéro c'est un A, tel numéro un B etc ... On peut transmettre du texte. C'est simplement ça l'ASCII. Maintenant si tu envois 1 en ASCII ou le nombre 1, il faut de l'autre côté assumer le bon format : est-ce que si je reçois le nombre 1 est-ce que c'est le correspondant en ASCII ou bien simplement le nombre 1 ?

Bonsoir skizoh,
Pourquoi me dis tu cela ?

En effet j'étais des deux cotés sur la vitesse de 115200 que j'ai passée a 9600 et le caractère est bon. ils sont bon ->"##"
On a donc progessé de une condition mais c'est laborieux car j'ai toujour un boîte "Error" qui ne permet pas d'avancer coté PC.
Je n'y connais rien en C# pour progresser.
Le retour de la carte MEGA est ok ->"!!"

// Première prise de contact avec l'appareil:
        // quand il a reçu ## il doit répondre!
        public bool handshake()
        {
            serialPort.WriteLine("##");

            string response = "";
            try
            {
                response = serialPort.ReadLine();
            }
            catch (Exception)
            {
                MessageBox.Show("No data1 from serial port", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return false;
            }
            
            if(response.Equals("!!")) return true;
            MessageBox.Show("Unknown device", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
        }

la derniere comparaison n'est pas "true" pourquoi?
mandrain

Bas tout simplement par ce que à ce niveau la quand tu vois des caractère déformer c'est rarement des erreurs de UTF8 ou autre connerie mais souvent des vitesses de transmission qui sont fausse ou qui différent :wink:

Maintenant pour la suite je te propose d’exprimer beaucoup plus clairement et poliment ton problème, nous ne somme pas un SAV et si tu nous parle comme des chiens tu risque de finir ce debug seul.

Sur ce , explique un peut plus ton problème: les caractères bizarre c'est fini ! maintenant where is a problem?

Skizo

mandrain:
la derniere comparaison n'est pas "true" pourquoi?

Bin c'est pas vraiment difficile à debuguer : au lieu de ta comparaison écris

MessageBox.Show(response);

Au moins tu sauras ce qui est réellement reçu dans response. Après un peu de recherche sur .Equals() et j'ai de suite compris ton problème alors que je ne pratique pas le C# : cette méthode compare des objets "!!" n'en est pas un.

http://blogs.msdn.com/b/csharpfaq/archive/2004/03/29/when-should-i-use-and-when-should-i-use-equals.aspx

skizoh:
Maintenant pour la suite je te propose d’exprimer beaucoup plus clairement et poliment ton problème, nous ne somme pas un SAV et si tu nous parle comme des chiens tu risque de finir ce debug seul.

Je comprend pas trop ta réaction ....

Bon d'accord j'ai fait mon relou il ne nous a pas parlé comme des chiens, mais je ressent une pointe d'ingratitude :roll_eyes:
Faut que j’arrête de lire les topics et d'aider les gens quand je taff, un peut de contrariété pour une coding phase qui n'abouti pas et je suis vite désagréable :.

Mea-culpa.

Bonjour à tous,

Hou lalalaaaa,
je m'absente 48 heures et voilà!

Je vous remarquer que:

j'ai peut être été un peu trop directe dans mon approche de ce sujet, mais loin de moi de prendre mes interlocuteurs pour des larbins ou pour un SAV.

Je croyais que c'était un forum? c'est à dire un lieu d'échange et de discution sur des sujets concernant un hobby commun.
Excusez moi,

Si c'est pour "le pourquoi me dis tu cela?", ce n'était qu'une quetion et non pas une remarque.

Maintenant concernant ce topic, je croyais aussi que le C# était censé assurer la portabilité entre les systèmes.
Donc en prenant ce petit utilitaire, il sufisait de le recompiler sur ma machine et la fonction aurait été assuré. Ce n'est pas le cas.
Je vais chercher quelque chose qui me rende ce service, car apprendre le C# pour une fonction comme ça c'est trop me demander.

Je crois avoir fait une mise à jour de ce sujet, et , je considère cet incident comme clos.

Je vous souhaite à tous et plus particulièrement à Skizoh et à B@tto un excellente journée.
Très amicalement
mandrain

mandrain:
Maintenant concernant ce topic, je croyais aussi que le C# était censé assurer la portabilité entre les systèmes.
Donc en prenant ce petit utilitaire, il sufisait de le recompiler sur ma machine et la fonction aurait été assuré. Ce n'est pas le cas.
Je vais chercher quelque chose qui me rende ce service, car apprendre le C# pour une fonction comme ça c'est trop me demander.

Entre quels systèmes ?

Sinon si tu veux résoudre ton problème directement (je pensais que tu voulais apprendre le C# au passage donc je ne t'ai pas donné la solution directement) :

// Première prise de contact avec l'appareil:
        // quand il a reçu ## il doit répondre!
        public bool handshake()
        {
            serialPort.WriteLine("##");

            string response = "";
            try
            {
                response = serialPort.ReadLine();
            }
            catch (Exception)
            {
                MessageBox.Show("No data1 from serial port", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return false;
            }
             string a = new string(new char[] {'!', '!'});
            if(response.Equals(a) return true;
            MessageBox.Show("Unknown device", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
        }

Savoir programmer sur PC c'est un vrai plus en Arduino, donc si tu choisis de t'investir sur le sujet ça sera jamais perdu. Perso j'ai "choisi" VB.NET car je connaissais la prog sous VB6 pour Excel (très très utile dans le monde du travail !) mais tu as analogiquement à Arduino le C/C++. Python a également pas mal de fan

Pas de problème je l'ai précisé je sortait d'une aprème de code qui restait sur un bug bloquant, donc les nerfs en pelote... Comme d'hab xD

Bon courage pour la suite, et si je doit te conseiller un langage pour les dev PC: Python !!! simple rapide à mettre en place et un simple éditeur de texte et quelques lib et tu fait ce que tu veux ^^

GL pour la suite.

Skizo !

re Bonjour,

Je m'explique:
La portabilité entre les systèmes du C#:

http://fr.openclassrooms.com/informatique/cours/apprenez-a-developper-en-c/introduction-au-c

c'est mieux qu'un long discour.

Pour le "petit utilitaire" en question, celle ci n'est pas assurée entre deux systèmes (Windows x <-> Windows 8.1).

j'en veux pour preuves, en dehors de la vitesse (115200 ma liaison courante entre Arduino MEGA2560 et mon PC) qui n'est pas la bonne pour cette application (9600 je n'ai pas chercher à augmenter la vitesse pour voir) .
le fonctionnement est le suivant:

  • emission par le pc "##"
  • reception mega "##"
  • emission mega "!!"
  • non reception pc "!!"

car on passe par catch (exeption) et ce qui suit derrière

MessageBox.Show("No data1 from serial port", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

voir dans le post ci-dessus pour la partie du code.
Là je suis bloqué car, en dehors de mettre un ligne d'affichage, je ne vois pas quoi faire pour progresser.

Si vous avez une idée je suis preneur.

Merci et bonne journée.
mandrain

Attend je crois qu'on s'est pas compris : tu as le message "No data1 from serial port" qui s'affiche ?

Bonsoir,
Effectivement je confirme j'ai le message:
"No data1 from serial port" qui s'affiche ?
Ca te dis quelque chose comme 'le port usb n'as rien recu!'
je redis exacte.
Mais pourquoi?? C'est la question et a 9600 bauds.

Pour l'instant j'ai utilisé un "utilitaire" sous "Processing" qui marche bien et sans problème a 115200 bauds.
J'aurais aimer un produit sous Visual Studio 2013 afin de copier un peu de code pour agir sur d'autres paramètres.
Je verrais ça plus tard.
Il me reste le wifi a coder.
amicalement
mandrain

si le PC ne reçoit rien, il faut essayer des choses plus basiques : au lieu de ton programme en C#, essaye déjà avec la console série de l'IDE arduino : est-ce que dans cette fenetre le PC reçoit le "!!" ?

si oui alors tu sais que c'est ton programme C# qui déconne. Si non, alors il faut chercher du coté de l'arduino ou de la liaison