SerialPort

Résolu
mimi35garry Messages postés 21 Date d'inscription mercredi 21 janvier 2009 Statut Membre Dernière intervention 8 février 2013 - 6 févr. 2013 à 14:38
mimi35garry Messages postés 21 Date d'inscription mercredi 21 janvier 2009 Statut Membre Dernière intervention 8 février 2013 - 7 févr. 2013 à 09:35
Bonjour,
je souhaite envoyé une donnée sur le port Com.
Voici mon code en C# qui fonctionne

            serialPort1.portName = "COM5";
            serialPort1.BaudRate = 9600;
            serialPort1.Parity = Parity.Even;
            serialPort1.StopBits = StopBits.One;
            serialPort1.DataBits = 8;
            serialPort1.Handshake = Handshake.None;
private void button1_Click(object sender, EventArgs e)
        {
 try
            {

                
                serialPort1.Write("FF" + "\n\r");
'069 en decimal=105 en octal=45 en hexa=01000101en binaire=E majuscule en ascii
                Thread.Sleep(10);                   
                }
            catch (Exception ex)
            {
                MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
 }
}

Voici celui en VB.net qui fonctionne aussi
SerialPort1.PortName = "COM5"              
        SerialPort1.BaudRate = 9600    
        SerialPort1.Parity = IO.Ports.Parity.Even           
        SerialPort1.DataBits = 8                           
        SerialPort1.StopBits = IO.Ports.StopBits.One 
  
Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
            envoyeCaractere(69)
'069 en decimal=105 en octal=45 en hexa=01000101en binaire=E majuscule en ascii
    End Sub

Private Sub envoyeCaractere(ByVal Code As Integer)
        SerialPort1.Write(Chr(Code))    
        Sleep(10)                   
        SerialPort1.Write(Chr(13))     
        Sleep(10)                       
        SerialPort1.Write(Chr(10))

    End Sub

Mon périphérique (une carte à base de PIC 16F876) attend 45 en héxa(ou 01000101) et le CR (0x0D)et le LF(0x0A) en ascii.

Mon code VB marche (en convertissant le decimal en en code ASCII) mais pas celui en C# enfin si mais je suis obligé de mettre un caractère après celui que je veus envoyer.
Par exemple E1,Ei,E?, Toujours deux caractères en commencant par la "vrai" lettre, si j'en met trois ca ne fonctionne plus le PIC vois bien que ce n'est pas une commande valide.
Les propriétées de sérialport1 sont les mêmes sauf en VB "modifiers Friend" et en C# "modifiers internal".
Voyez vous pourquoi en C# je suis obligé de doublé la lettre ?

mimi35garry vous salut bien

4 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
6 févr. 2013 à 22:29
Salut,

CRLF = \r\n et pas \n\r

Il me semble que les chaines C# sont en UNICODE, une lettre = 2 octets.
As tu essayé la surcharge suivante :

serialPort1.Write( Encoding.ASCII.GetBytes("E\r\n") );


bye...
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
6 févr. 2013 à 15:15
Enlève le Thread.Sleep(10); du code C#, il suspend le process et donc probablement empêche l'envoie des caractères sur le port série

Vérifie aussi les bufferThreshold (connais plus exactement le nom exact), tu dois avoir 0 ou 1 sur celui d'emission pour que l'envoi soit immédiat



[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
mimi35garry Messages postés 21 Date d'inscription mercredi 21 janvier 2009 Statut Membre Dernière intervention 8 février 2013
6 févr. 2013 à 17:27
Merci de ta réponse casy
le serialPort1.ReceivedBytesThreshold= nombre octet
est pour le datareceived, apparemment c'est pour indiquer le nombre d'octets qui sont reçu avant que l'évenenment datareceived ne se déclenche (dixit visual studio)
J'ai testé sans le sleep et c'est pareil.
Pour infos je l'avais mis pour cette configuration pour testé
serialPort1.Write(textBox2.Text);   
Thread.Sleep(10);                   
serialPort1.Write("\n");    
Thread.Sleep(10);                     
serialPort1.Write("\r");

Mais sa ne changeait rien.

Merci encore

mimi35garry vous salut bien
0
mimi35garry Messages postés 21 Date d'inscription mercredi 21 janvier 2009 Statut Membre Dernière intervention 8 février 2013
7 févr. 2013 à 09:35
bonjour,
oh le boulet, c'est bien \r\n et pas \n\r.
Merci yann_lo_san
merci à casy et tout les Codes-sourceurs.

mimi35garry vous salut bien
0
Rejoignez-nous