Envoi byte sur port com usb

Signaler
Messages postés
2
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
30 septembre 2012
-
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
-
Bonjour à tous,

étant néophyte en programmation c#,j'aurai besoin d'envoyer une commande sur un port com.

l'idée étant de commander un relais via un raccourci sur le bureau.
le raccourci commande l’exécutable qui sur le port com:
envoi un byte pour actionner le relais
met un timer de 1s
envoi un autre byte pour fermer le relais

je précise que je ne voudrais pas de console qui apparaisse et c'est la que ça coince, car d’après un modèle sur le site du fabriquant du relais, j'ai pu lui faire, par interprétation une sérieuse cure d'amaigrissement. et ça marche, seulement voila dans ce code, j'ai un form.cs qui attend une action de ma part, et comme vous l'avez compris, je n'en veux pas.



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;          // added to include serial ports
using System.IO;
using System.Management;

namespace RELAY_MODULE_TEST
{
    public partial class Form1 : Form
    {
        public delegate void AsyncCallback(IAsyncResult ar);
        public delegate void AddTolstDiscoveredDevices(object o);
        enum modules { NONE = 0, USB_RLY02};
        int module_id = (int)modules.NONE;
        static SerialPort USB_PORT;
        byte[] SerBuf = new byte[10];
        byte serial_written_flag = 0;
       

        public Form1()
        {
            InitializeComponent();
            USB_PORT = new SerialPort();
            string[] comportnames = new string[100];
            comportnames = SerialPort.GetPortNames();
            var sortedList comportnames.OrderBy(port> Convert.ToInt32(port.Replace("COM", string.Empty)));

           foreach (string port in sortedList)
            {
               comboBox_comport.Items.Add(port);                      // places each "COMx" name into combobox
               comboBox_comport.Text = "COM4";
            }
            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            switch (module_id) //module specific code
            {
                case (int)modules.USB_RLY02:
                   
                   break;
            }
            if (module_id != (int)modules.NONE)     //if any module is connected then this is the common code
            {
                SerBuf[0] = 0x5B;       // get states command
                transmit(1);
                receive(1);

                if ((SerBuf[0] & 0x01) == 0x01)
                {
                    button_relay1.Text = "RELAY ON";
                    button_relay1.BackColor = Color.Red;
                }
                else
                {
                    button_relay1.Text = "RELAY OFF";
                    button_relay1.BackColor = Color.White;
                }        
           }
        }

        private void comboBox_comport_SelectedIndexChanged(object sender, EventArgs e)  //opens a comport or network stream corresponding with combobox selection
        {
            module_id = (int)modules.NONE;
            
                if (USB_PORT.IsOpen) USB_PORT.Close();        // close any existing handle
                USB_PORT.PortName = comboBox_comport.Text;    // retrieves "COMx" from selection in combo box
                USB_PORT.Parity = 0;
                USB_PORT.BaudRate = 19200;
                USB_PORT.StopBits = StopBits.Two;
                USB_PORT.DataBits = 8;
                USB_PORT.ReadTimeout = 50;
                USB_PORT.WriteTimeout = 50;
                USB_PORT.Open();

                SerBuf[0] = 0x5A;       // get version command for RLY16, returns module id and software version
                transmit(1);
                receive(2);

                if (SerBuf[0] != 255)  // if wee recieved the module id  
                {
                    module_id = SerBuf[0];
                }
            
        }

        private void transmit(byte write_bytes)
        {
                try
                {
                    if (USB_PORT.IsOpen) USB_PORT.Write(SerBuf, 0, write_bytes);      // writes specified amount of SerBuf out on COM port
                }
                catch (Exception)
                {
                    USB_PORT.Close();
                    module_id = (int)modules.NONE;
                }
        }

        private void receive(byte read_bytes)
        {
            byte x;
                for (x = 0; x < read_bytes && USB_PORT.IsOpen; x++)       // this will call the read function for the passed number times, 
                {                                      // this way it ensures each byte has been correctly recieved while
                    try                                // still using timeouts
                    {
                        USB_PORT.Read(SerBuf, x, 1);     // retrieves 1 byte at a time and places in SerBuf at position x
                    }
                    catch (Exception)                   // timeout or other error occured, set lost comms indicator
                    {
                        USB_PORT.Close();
                        SerBuf[0] = 255;
                        MessageBox.Show("read fail");
                        module_id = (int)modules.NONE;
                    }
                }
        }

        private void button_relay1_Click(object sender, EventArgs e)
        {
                if (button_relay1.Text "RELAY ON") SerBuf[0] 0x6F;                   
                else SerBuf[0] = 0x65;
                transmit(1);
        }
         }
}

6 réponses

Messages postés
2
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
30 septembre 2012

Merci d'avances pour vos réponses
Messages postés
14896
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 octobre 2020
446
Bonjour

une petite précision tu parles de console et de form.cs.

Ce n'est pas la même chose une application console va démarrer dans une fenêtre de commande DOS et 9 fois sur 100 cette fenetre se fermera d'elle même à la fin de l'exécution. Ce qui pourrait correspondre à ton besoin mais je ne suis pas sur que le timer fonctionne dans les applications console.

Le code que tu as posté est une application WinForm et si je comprends bien ta demande, tu ne veux pas avoir à choisir le port via la liste déroulante ni cliquer sur le bouton.

Pour le choix du port forcer le texte du combobox à "COM4" doit résoudre le problème (je ne peux pas essayer je ne pas de port com chez moi...), pour plus de rapidité tu peux sortir cette instruction de la boucle, elle ne sera exécutée qu'une seule fois.


Quand tu clique sur le bouton le code exécuté est celui-ci
        private void button_relay1_Click(object sender, EventArgs e)
        {
                if (button_relay1.Text "RELAY ON") SerBuf[0] 0x6F;                   
                else SerBuf[0] = 0x65;
                transmit(1);
        }



button_relay1_Click est une méthode qui est abonnée au click du bouton mais que tu peux appeller quand tu veux.

Donc au démarrage de ton appli
        public Form1()
        {
            InitializeComponent();
            USB_PORT = new SerialPort();
            string[] comportnames = new string[100];
            comportnames = SerialPort.GetPortNames();
            var sortedList comportnames.OrderBy(port> Convert.ToInt32(port.Replace("COM", string.Empty)));

           foreach (string port in sortedList)
            {
               comboBox_comport.Items.Add(port);                      // places each "COMx" name into combobox
               
            }
            comboBox_comport.Text = "COM4";//j'ai sortit ça de la boucle pour optimiser le code


            //ici j'appelle la méthode du bouton
            button_relay1_Click(this, new EventArgs);//la méthode demande un objet je lui est mis this qui correspond à l'instance en cours du formulaire et une variable donnant des détails sur l'événement en cours, comme je n'en ai pas j'en crée une toute neuve.
        }

Comme je l'ai écrit plus haut je n'ai pas de port com, je n'ai pas testé mais ça devrait marcher.


par contre dans ton code, le timer qui change le type de message envoyé n'est jamais démarré, ce qui me surprends. Il me semblerait logique que tu envoies le premier message, que tu lances un timer de 1s et qu'il envoie le second message.
Ce serait à ce moment que tu pourrais ajouter
this.Close()
qui fermerait l'application.
Whismeril
Messages postés
14896
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 octobre 2020
446
oups
9 fois sur 100
je voulais écrire 9 fois sur 10


Whismeril
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
6
Bonjour,

Un message non pas pour t'aider mais pour avoir des infos car je suis en train de regarder comment dialoguer avec un appareil sur port USB.

Le titre de ton message laisse entendre que tu dialogues donc avec un port USB mais dans ton code je vois que tu utilises la classe SerialPort du framework.

Ma question : utilises tu un adaptateur USB/Série ?

Si non utilises tu une librairie particulière pour dialoguer directement avec ton port USB ?

S.D

[b]"Chez ceux qui semblent très vertueux se cachent en général la vanité, l'orgueil, l'intolérance".

P.Coehlo (Maktub 2004)/b
Messages postés
14896
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 octobre 2020
446
Bonsoir dodo, le titre est assez parlant je pense:
envoi byte sur port com usb
.

Il s'agit d'une interface USB / Série qui crée un port Com virtuel


Whismeril
Messages postés
642
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
6
Ah oui bien joué j'avais pas compris le titre comme cela. Autant pour moi.

Merci !

SD


[b]"Chez ceux qui semblent très vertueux se cachent en général la vanité, l'orgueil, l'intolérance".

P.Coehlo (Maktub 2004)/b