Communication port série rs232

Messages postés
11
Date d'inscription
lundi 9 mars 2015
Statut
Membre
Dernière intervention
19 mars 2015
-
bonjour;
voila je travail sur un projet ou je vais faire une communication entre mon pc et MSC32EX SERAD (http://www.serad.fr/Commande-d-axes-MCS32ex.htm) qui se fait avec le port série RS232, donc j'ai trouvé un code source (http://codes-sources.commentcamarche.net/source/18704-communication-serie-rs232-win32) je l'ai executé avec Visual Studio Express 2012 quand je lance ce code le compilateur me donne le message "Erreur:




pouvez vous m'aider. svp
Afficher la suite 

16 réponses

Meilleure réponse
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
1
Merci
Salut,

tu peux rajouter BOOL pour les type de retour des fonctions inline

inline BOOL IsSendFile() ...
inline BOOL IsPauseSendFile() ...
inline BOOL IsReceiveFile() ...
inline BOOL IsPauseReceiveFile() ...

bye...

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 219 internautes nous ont dit merci ce mois-ci

Commenter la réponse de yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
1
Merci
Salut,

La base pour communiquer est

1 : Connaitre le port à utiliser

2 : Bien connaitre le "protocole" vers le device
(quels octets envoyer et quels octets recevoir)

3 : Savoir initialiser les 2 structures suivantes selon ses besoins
COMMTIMEOUTS
DCB

4 : Connaitre les fonctions win32 suivantes
CreateFile
SetupComm
SetCommTimeouts
SetCommState
PurgeComm
EscapeCommFunction
WriteCOM
ReadCOM
CloseHandle

Exemple minimal, sans gestion d'erreur et sans protocole

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define RX_SIZE	4096 /* taille tampon d'entrée  */
#define TX_SIZE	4096 /* taille tampon de sortie */
#define MAX_WAIT_READ 5000 /* temps max d'attente pour lecture (en ms) */
#define MAX_WAIT_READ_TOTAL 7000 /* temps max pour la lecture du tampon de reception */

HANDLE g_hCOM = NULL;

COMMTIMEOUTS g_cto = {MAX_WAIT_READ,0,MAX_WAIT_READ_TOTAL,0,0};

DCB g_dcb = 
{
    sizeof(DCB),CBR_9600,TRUE,FALSE,FALSE,FALSE,DTR_CONTROL_ENABLE,FALSE,FALSE,
    FALSE,FALSE,FALSE,FALSE,RTS_CONTROL_ENABLE,FALSE,0,0,0x100,0x100,8,NOPARITY,
    ONESTOPBIT,0x11,0x13,'?',0x1A,0x10
};

int main(int argc, char** argv)
{
	/* Ouvre COM3 */
	int nId = 3;
	char szCOM[16];
	sprintf(szCOM, "COM%d", nId);
	g_hCOM = ::CreateFile(szCOM,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,NULL);

	/* Affectation taille des tampons d'émission et de réception */
	SetupComm(g_hCOM, RX_SIZE, TX_SIZE);

	/* Configure */
	SetCommTimeouts(g_hCOM, &g_cto);
	SetCommState(g_hCOM, &g_dcb);

	/* on vide les tampons d'émission et de réception, mise à 1 DTR */
	PurgeComm(g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
	EscapeCommFunction(g_hCOM, SETDTR);

	int nBytesWritten, nBytesRead;
	char buffer[256];
	
	/* (SELON LE PROTOCOLE VOULU) Ecrit la commande X sur le port */
	strcpy(buffer, "X\r\n");
	WriteCOM(buffer, strlen(buffer), &nBytesWritten);

	/* Pour la lecture du port */
	/*ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead);*/
	/*buffer[nBytesRead] = '\0';*/

	/* Ferme le port */
	::CloseHandle(g_hCOM);
}


bye...

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 219 internautes nous ont dit merci ce mois-ci

Commenter la réponse de yann_lo_san
Messages postés
11
Date d'inscription
lundi 9 mars 2015
Statut
Membre
Dernière intervention
19 mars 2015
0
Merci
salut,
merci pour votre aide oui ça marche le code fonctionne.
mais la j'ai un souci, j'arrive pas a communique avec MCS 32EX SERAD il n'y a rien qui s'affiche. je suis perduuuuuu

comment faire pour établir la communication???
de l'aide svp
Commenter la réponse de tinhimahz
Messages postés
11
Date d'inscription
lundi 9 mars 2015
Statut
Membre
Dernière intervention
19 mars 2015
0
Merci
bonjour, merci bien pour votre réponse.

entre mon pc et le MCS 32EX SERAD j'utilise un câble série pour la communication.
le MSC 32ES SERAD il a un port de communication qui se nomme Serial1 pour effectuer le téléchargement de la configuration, des variable, des taches... entre le pc et la MCS.

pour configurer l'ouverture de ce port : open <<SERIAL1 :9600,8,n,1 sachant qu''il possède un buffer ou tampo de transmission et réception de 500 oct.

sur mon pc je détecte le port com4.
donc: pc<=> MSC=> Dialog 80
Com4<=> serial1=>

comment peut-on faire la liaison sur ces deux port pour établir la communication?
faut-il déclarer (configurer) les deux port dans même programme ?
Commenter la réponse de tinhimahz
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Re,

non, j'imagine que com4 doit permettre d'envoyer et de recevoir ce que tu veux.

Par contre sur le site du constructeur il y a une référence à

L'atelier logiciel MCB EX sur PC sous environnement Windows® supporte les langages de programmation Motion Basic et Ladder ; ce qui permet de développer rapidement une application complexe. Le code compilé sera exécuté par le puissant noyau temps réel de la MCS 32EX

As tu essayé de passer par cet outil qui semble fait exclusivement pour ce matériel ? (ou peut être est il payant)

Enfin, as tu une documentation des commandes valides et des octets de contrôle pouvant être envoyés par cette méthode ? Si oui, tu as tout ce qu'il faut pour le faire.

Pour info,
j'ai utilisé cette méthode avec succès pour dialoguer avec des imprimantes thermiques (Datamax ou zebra) et aussi avec une balance (KERN) pour peser de l'or par exemple.

Mais je ne connais pas du tout les spécificités des "axes servo".

bye...
Commenter la réponse de yann_lo_san
Messages postés
11
Date d'inscription
lundi 9 mars 2015
Statut
Membre
Dernière intervention
19 mars 2015
0
Merci
Bonjour Yann_lo_sa;
je vous remercie beaucoup pour votre aide.
voila une image d'une interface que je veux mettre en point :


est ce que vous pouvez m'aider a la réaliser ?
est ce que on peut faire une interface comme cela avec visuel studio? ou autre logiciel a me conseiller?

mercci infiniment
Commenter la réponse de tinhimahz
Messages postés
11
Date d'inscription
lundi 9 mars 2015
Statut
Membre
Dernière intervention
19 mars 2015
0
Merci
salut ,
j'ai commencer a travailler l'interface avec visuel Basic.
Commenter la réponse de tinhimahz
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Re,

ha oui, je comprends mieux ce que tu veux faire avec le schéma.

Visual basic est tout a fait correct pour ça.
D'ailleur n'importe quel outil de programmation un peu évolué est capable de fournir ce qu'il faut pour implémenter de telles interfaces.

Sinon, comme je te disais, je n'ai aucune expérience des "axes servo", mais si tu as des questions spécifiques au code C/C++/C# ou même basic, j'essaierais d'y répondre avec plaisir.

Bonne prog !

bye...
Commenter la réponse de yann_lo_san
Messages postés
11
Date d'inscription
lundi 9 mars 2015
Statut
Membre
Dernière intervention
19 mars 2015
0
Merci
salut,
Vous n'avez pas qu'elle tutoriel a me donner pour m'aider à programmer les différentes taches de l'interface, car la je galère je part dans tout les sens ?????

Merciiii
Commenter la réponse de tinhimahz
Messages postés
11
Date d'inscription
lundi 9 mars 2015
Statut
Membre
Dernière intervention
19 mars 2015
0
Merci
Bonjour,

j'ai réussi a programmer le port, me connecter et déconnecter.
quand j'importe un fichier de mon bureau avec le button charger j'ai constaté qu'il faut le sauvegarder dans un tampon ou buffer pour ensuite l'envoyer. j'ai tant cherché pour géré ça mais j'ai pas trouver la solution.
peux tu m'aider?????

voila le code que j'ai fait jusqu'à présent:

Imports System.IO
Imports System
Imports System.Threading
Imports System.IO.Ports
Imports System.ComponentModel

Public Class Form1

'DECLARE a COMM PORT
' Dim WithEvents Myport As SerialPort = New _
' System.IO.Ports.SerialPort("COM0", _
' 9600, _
'Parity.None, _
'8, _
'StopBits.One)


Dim myPort As Array 'COM Ports detected on the system will be stored here
Delegate Sub SetTextCallback(ByVal [text] As String) 'Added to prevent threading errors during receiveing of data


Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'When our form loads, auto detect all serial ports in the system and populate the cmbPort Combo box.
myPort = IO.Ports.SerialPort.GetPortNames() 'Get all com ports available
For i = 0 To UBound(myPort)
PortBox.Items.Add(myPort(i))
Next

PortBox.Text = PortBox.Items.Item(0) 'Set cmbPort text to the first COM port detected
DeconnecteButton.Enabled = False
End Sub


'la fenetre PC=>MCS '

Private Sub GroupBox1_Enter(sender As Object, e As EventArgs) Handles GroupBox1.Enter

End Sub

'le button du port'
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles PortBox.SelectedIndexChanged

If SerialPort1.IsOpen = False Then
SerialPort1.PortName = PortBox.Text 'pop a message box to user if he is changing ports
Else 'without disconnecting first.
MsgBox("Valid only if port is Closed", vbCritical)
End If

End Sub

'button charger'
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles ChargeButton.Click

OpenFileDialog1.Filter = "TextFile|*.prj"
OpenFileDialog1.ShowDialog()

End Sub

'button connecter'
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles ConnecteButton.Click


SerialPort1.PortName = PortBox.Text 'Set SerialPort1 to the selected COM port at startup

'Other Serial Port Property
SerialPort1.BaudRate = 9600
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.DataBits = 8 'Open our serial port
SerialPort1.Open()

ConnecteButton.Enabled = False 'Disable Connect button
DeconnecteButton.Enabled = True 'and Enable Disconnect button
RadioButton.BackColor = Color.Gray
ChargeButton.Enabled = True

End Sub

'button envoyer'
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles EnvoyButton.Click
SerialPort1.Write(ChargeButton.Text & vbCr) 'The text contained in the txtText will be sent to the serial port as ascii
'plus the carriage return (Enter Key) the carriage return can be ommitted if the other end does not need it


End Sub


'button deconnecter'
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles DeconnecteButton.Click

SerialPort1.Close() 'Close our Serial Port

ConnecteButton.Enabled = True
DeconnecteButton.Enabled = False
RadioButton.BackColor = Color.Red
ChargeButton.Enabled = False

End Sub


'fenetre MSC=>PC'
Private Sub GroupBox2_Enter(sender As Object, e As EventArgs) Handles GroupBox2.Enter

End Sub

'button recevoir'

Private Sub Button6_Click(sender As Object, e As EventArgs) Handles RecevButton.Click

End Sub

'button sauvegarder'
Private Sub Button7_Click(sender As Object, e As EventArgs) Handles SauvegardeButton.Click

End Sub



Private Sub RadioButton_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton.CheckedChanged

End Sub



Private Sub ProgressBar1_Click(sender As Object, e As EventArgs) Handles ProgressBar1.Click
ProgressBar1.Value = 0.0
ProgressBar1.Maximum = 100
Timer1.Interval = 40
Timer1.Enabled = True
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
If ChargeButton < 100 Then
ProgressBar1.Value = ChargeButton
ChargeButton = ChargeButton + 1
Else
Timer.Enabled = False
Me.Hide()
End If
End Sub
End Class


j'essaye de m'inspire de ce code delphi :

type
TForm1 = class(TForm)
ComPort1: TComPort;
ProgressBar1: TProgressBar;
GroupBox1: TGroupBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Bevel1: TBevel;
ComLed1: TComLed;
ComLed2: TComLed;
Label1: TLabel;
Label2: TLabel;
StatusBar1: TStatusBar;
Bevel2: TBevel;
ListBox1: TListBox;
BitBtn3: TBitBtn;
Edit1: TEdit;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
GroupBox2: TGroupBox;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
BitBtn6: TBitBtn;
Bevel3: TBevel;
ListBox2: TListBox;
Edit2: TEdit;
Bevel4: TBevel;
BitBtn7: TBitBtn;
BitBtn8: TBitBtn;
ComPort2: TComPort;
ComLed4: TComLed;
ComLed5: TComLed;
ComLed6: TComLed;
ProgressBar3: TProgressBar;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
ProgressBar2: TProgressBar;
Image1: TImage;
Label3: TLabel;
ComComboBox1: TComComboBox;
ComComboBox2: TComComboBox;
ComLed3: TComLed;
ProgressBar4: TProgressBar;
BitBtn9: TBitBtn;
BitBtn10: TBitBtn;
procedure ComPort1RxFlag(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn7Click(Sender: TObject);
procedure ListBox2Click(Sender: TObject);
procedure BitBtn9Click(Sender: TObject);
procedure BitBtn10Click(Sender: TObject);
procedure BitBtn8Click(Sender: TObject);
procedure ComPort2RxFlag(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form1: TForm1;
i,nboucles : integer;
tampon : integer;
a,b,c,d,e,f,g,h,j : string;
car,paquet : string;
chaine : widestring;

implementation

{$R *.DFM}

procedure TForm1.ComPort1RxFlag(Sender: TObject);
begin
if (tampon)<=128977 then //128876
begin
while tampon<101*nboucles do
tampon := comport1.inputcount;
progressbar1.StepIt;
statusbar1.simpletext:=formatfloat('##0',(tampon*100/101)/127800*100)+'% Transférés';
comport1.writestr(chr(13));
nboucles:=nboucles+1;
tampon := comport1.inputcount;
end
else
begin
statusbar1.SimpleText:='Transfert Terminé';
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
nboucles:=1;
tampon := 0;
chaine := '';
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if comport2.connected=true then
begin
comport2.clearbuffer(true,true);
comport2.connected:=false;
end;
comport1.connected:=true;
comport1.clearbuffer(true,true);
statusbar1.simpletext:='Connecté...';
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
listbox1.Clear;
statusbar1.SimpleText:='Appuyez sur "F6" de la commande numérique puis patientez...';
comport1.writestr(chr(13));
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
statusbar1.simpletext:='Ecriture du programme en cours; Patientez s.v.p...';
for i:=1 to 1278 do
begin
comport1.readstr(car,1);
comport1.readstr(paquet,100);
chaine := chaine + paquet;
progressbar2.stepit;
end;
for i:=0 to 14199 do
begin
a:=chaine[i*9+1];
b:=chaine[i*9+2];
c:=chaine[i*9+3];
d:=chaine[i*9+4];
e:=chaine[i*9+5];
f:=chaine[i*9+6];
g:=chaine[i*9+7];
h:=chaine[i*9+8];
j:=chaine[i*9+9];
listbox1.items.add(a+b+c+d+e+f+g+h+j);
end;
statusbar1.simpletext:='Terminé.';
chaine := '';
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
edit1.text:=inttostr(listbox1.itemindex);
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
if savedialog1.execute then
listbox1.items.savetofile(savedialog1.filename+'.pcn');
end;

procedure TForm1.BitBtn5Click(Sender: TObject);
begin
chaine := '';
if opendialog1.execute then
listbox2.items.loadfromfile(opendialog1.filename);
statusbar1.simpletext:='Chargement du fichier...';
for i:=0 to 14199 do
begin
chaine:=chaine+listbox2.Items[i];
progressbar4.stepit;
end;
statusbar1.SimpleText:='Fichier chargé.';
end;

procedure TForm1.BitBtn7Click(Sender: TObject);
begin
if listbox2.items.count=14200 then
begin
if comport1.connected=true then
begin
comport1.clearbuffer(true,true);
comport1.connected:=false;
end;
comport2.Connected:=true;
comport2.clearbuffer(true,true);
statusbar1.SimpleText:='Connecté...';
end
else
showmessage('Impossible de se connecter : Le programme à envoyer est incomplet');
end;

procedure TForm1.ListBox2Click(Sender: TObject);
begin
edit2.text:=inttostr(listbox2.ItemIndex);
end;

procedure TForm1.BitBtn9Click(Sender: TObject);
var
tampon : string;
begin
comport2.readstr(tampon,comport2.inputcount);
comport2.ClearBuffer(true,true);
comport2.connected:=false;
statusbar1.simpletext:='Déconnecté.';
end;

procedure TForm1.BitBtn10Click(Sender: TObject);
var
tampon : string;
begin
comport1.readstr(tampon,comport1.inputcount);
comport1.ClearBuffer(true,true);
comport1.connected:=false;
statusbar1.simpletext:='Déconnecté.'
end;

procedure TForm1.BitBtn8Click(Sender: TObject);
begin
nboucles:=0;
statusbar1.SimpleText:='Appuyez sur "F6" de la commande numérique puis patientez...';
comport2.writestr(chr(10));
end;

procedure TForm1.ComPort2RxFlag(Sender: TObject);
begin
if nboucles<=1278 then
begin
paquet:='';
for i:=1 to 100 do
paquet := paquet + chaine[i+100*nboucles];
nboucles:=nboucles+1;
progressbar3.stepit;
statusbar1.SimpleText:=formatfloat('##0',nboucles/1278*100)+'% Transférés';
comport2.writestr(paquet);
end
else
statusbar1.simpletext:='Transfert terminé.';
end;

end.



MERCIIIIIIIIIIII
Commenter la réponse de tinhimahz
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Salut,

j'ai fait un petit formulaire vb .net avec
1 bouton pour charger un fichier,
2 textbox multiLignes pour afficher le contenu au format texte et au format "octet"
(et un SerialPort)



Au click sur le btn,
je charge le fichier
Je crée un buffer d'octets pour y mettre le contenu
J'affiche en "texte"
J'affiche en "octet"
et j'envoi le buffer sur le port (instruction commenté)


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim dlg As OpenFileDialog = New OpenFileDialog() 'Charge un fichier sur le disque
    If dlg.ShowDialog() = Windows.Forms.DialogResult.OK Then

        Dim sDatasTexte = System.IO.File.OpenText(dlg.FileName).ReadToEnd() 'Récup le contenu format texte

        ' Place le contenu dans un buffer d'octets (ASCII: 1 char = 1 octet) (UNICODE: 1 Char = 2 octets)
        Dim bBufferBytes() As Byte = System.Text.Encoding.ASCII.GetBytes(sDatasTexte)

        TextBox1.Text = sDatasTexte ' Affiche le bloc de texte

        ' Et affiche le bloc sour forme d'octets (Convertit les retour chariots pour l'affichage)
        For i = 0 To UBound(bBufferBytes)
            TextBox2.Text = TextBox2.Text & String.Format("{0:X2} ", bBufferBytes(i)) ' Ou Hex(bBufferBytes(i))
            If System.Text.Encoding.ASCII.GetString(bBufferBytes, i, 1)(0) = vbLf Then TextBox2.Text = TextBox2.Text & vbCrLf
        Next

        ' =============================================
        ' Ecrit le buffer complet sur le SerialPort
        ' ============================================= 
        'SerialPort1.Write(bBufferBytes, 0, bBufferBytes.Length)
    End If
End Sub



Voilà, si ça peut t'aider.
Attention, c'est fait en ASCII (1 caractere = 1 octet)


bye...
Commenter la réponse de yann_lo_san
Messages postés
11
Date d'inscription
lundi 9 mars 2015
Statut
Membre
Dernière intervention
19 mars 2015
0
Merci
salut,
je te remercié infiniment pour ton aide.

voila le code que j'ai fait jusqu'à présent:
Imports System.IO
Imports System
Imports System.Threading
Imports System.IO.Ports
Imports System.ComponentModel

Public Class Form1

    'DATA RECEIVED 
    Dim inputData As String
    Public Event DataReceived As IO.Ports.SerialDataReceivedEventHandler

    Dim myPort As Array  'les ports Com détecter sur le pc seront stokés ici
    Delegate Sub SetTextCallback(ByVal [text] As String) 'Added to prevent threading errors during receiveing of data


    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'When our form loads, auto detect all serial ports in the system and populate the cmbPort Combo box.
        myPort = IO.Ports.SerialPort.GetPortNames() 'Obtenir tout les ports series 

        For i = 0 To UBound(myPort)
            PortBox.Items.Add(myPort(i))
        Next

        PortBox.Text = PortBox.Items.Item(0)    'Set cmbPort text to the first COM port detected
        DeconnecteButton.Enabled = False
        Me.KeyPreview = True

    End Sub


    'BUTTON CHARGER

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles ChargeButton.Click

        Dim dlg As OpenFileDialog = New OpenFileDialog() 'Charge un fichier sur le disque
        If dlg.ShowDialog() = Windows.Forms.DialogResult.OK Then

        End If

        Dim sDatasTexte = System.IO.File.OpenText(dlg.FileName).ReadToEnd() 'Récup le contenu format texte

        ' Place le contenu dans un buffer d'octets (ASCII: 1 char = 1 octet) (UNICODE: 1 Char = 2 octets)
        Dim bBufferBytes() As Byte = System.Text.Encoding.ASCII.GetBytes(sDatasTexte)

        'TextBox.Text = sDatasTexte ' Affiche le bloc de texte

        ' Et affiche le bloc sour forme d'octets (Convertit les retour chariots pour l'affichage)
        For i = 0 To UBound(bBufferBytes)
            TextBox.Text = TextBox.Text & String.Format("{0:X2} ", bBufferBytes(i)) ' Ou Hex(bBufferBytes(i))
            If System.Text.Encoding.ASCII.GetString(bBufferBytes, i, 1)(0) = vbLf Then TextBox.Text = TextBox.Text & vbCrLf
        Next

        ' Ecrit le buffer complet sur le SerialPort
        SerialPort1.Write(bBufferBytes, 0, bBufferBytes.Length)

        Timer1.Start()

    End Sub

    'BUTTON CONNECTER

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles ConnecteButton.Click
        SerialPort1.PortName = PortBox.Text  'Réglez le port série ou port COM sélectionné au démarrage

        'Autres propriété du port com
        SerialPort1.BaudRate = 9600
        SerialPort1.Parity = IO.Ports.Parity.None
        SerialPort1.StopBits = IO.Ports.StopBits.One
        SerialPort1.DataBits = 8
        SerialPort1.Open()  'Open our serial port

        'ecrire les informations dans la memoire tampon de sortie du port serie
        If SerialPort1.IsOpen = True Then
            ToolStripStatusLabel1.Text = "Port ouvert"
        End If


        ConnecteButton.Enabled = False      'Désactiver bouton Connect
        DeconnecteButton.Enabled = True     'activer le bouton Déconnecter
        RadioButton.BackColor = Color.Gray
        ChargeButton.Enabled = True

    End Sub

    'BUTTON ENVOYER

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles EnvoyButton.Click
        ' SerialPort1.Write(ChargeButton.Text & vbCr) 'The text contained in the txtText will be sent to the serial port as ascii
        'plus the carriage return (Enter Key) the carriage return can be ommitted if the other end does not need it

        ToolStripStatusLabel1.Text = "Appuyez sur 'F6' de la commande numérique puis patientez..."

        If Me.KeyPreview = True Then
            SerialPort1.Write(ChargeButton.Text & vbCr)
            'SerialPort1.Write(Chr(10))

        End If

    End Sub


    'BUTTON DECONNECTER 

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles DeconnecteButton.Click
        SerialPort1.Close()             'Close our Serial Port

        ConnecteButton.Enabled = True
        DeconnecteButton.Enabled = False
        RadioButton.BackColor = Color.Red
        ChargeButton.Enabled = False

    End Sub


    'BUTTON RECEVOIR

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles RecevButton.Click
        ToolStripStatusLabel1.Text = "Appuyez sur 'F6' de la commande numérique puis patientez..."

        If Me.KeyPreview = True Then ' le teste de button F6
            SerialPort1.Write(ChargeButton.Text & vbCr)
            'SerialPort1.Write(Chr(10))

        End If

        SerialPort1.Write(Chr(13))

        Timer1.Start()

    End Sub

    'BUTTON SAUVEGARDER
    Private Sub Button7_Click(sender As Object, e As EventArgs) Handles SauvegardeButton.Click

    End Sub

    'TIMER DE LA BAR 
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        ProgressBar1.Increment(1)
        If ProgressBar1.Value = 100 Then
            'Label2.Text = "Télechargement Réussi"
            ToolStripStatusLabel1.Text = "Télechargement Réussi"
        End If
        Label1.Text = ProgressBar1.Value & ("%")
    End Sub

    'TESTE DU BUTTON F6

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If e.KeyCode = Keys.F6 Then
            MsgBox("oeuvres")

        End If
    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        inputData = SerialPort1.ReadExisting

        Me.Invoke(New EventHandler(AddressOf Affiche))
    End Sub

    'afficher les donnees recues dans l'interface utilisateur
    Private Sub Affiche()
        TextBox1.Text &= inputData
    End Sub

End Class


l'interface ;


voila ma logique pour activer le bouton Recevoir un fichier :
- Click sur le bouton recevoir
- attendre une instruction que je doit faire sur le terminal opérateurs IHM (dialog 80) donc appuyer sur F6
- dés que cette instruction est réalisé normalement je commence à recevoir des données stock dans la mémoire de MCS ver mon pc et elle seront afficher dans la textBox.
- lire les donnée sur le port série .
-Après avoir récupérée les données je vais les sauvegarder.
-j'ai utilisé l'événement dataReceived.

pour le bouton Charger:
- charger un fichier de mon pc.
- puis mettre les donnée dans un buffer

pour le bouton envoyer :
-pour l'envoyer il faut que je Click sur F6 de MCS pour transféré les données stock de mon Pc vers MCS.

mais la, appart le bouton charger les autre ne fonctionne pas???
Commenter la réponse de tinhimahz
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Salut,

Plusieurs problèmes,
Dans le bouton "envoyer", tu n'envois pas le buffer mais le texte du bouton (ChargeButton.Text) !
Qui est la chaine de caractère "Charger"&+ vbCr
Ensuite tu envois le buffer dans le click sur Charger, il faut l'enlever.



Dans un premier temps, il faut que tu fasses ceci


1 : Mettre le buffer a "envoyer" en tant que variable globale à ta classe et pas locale au click du bouton
Public Class Form1

    Public Dim bBufferBytes() As Byte 

    ...

End Class




2 : Dans le bouton "Charger", Utilises la variable globale et pas locale , changes juste ceci (Et surtout ne fais pas le write !)

Private Sub Button1_Click(sender ...
    ...
       ' Place le contenu dans un buffer d'octets ...
        bBufferBytes = System.Text.Encoding.ASCII.GetBytes(sDatasTexte)

   ''NE PAS FAIRE LE WRITE ICI !
   ''SerialPort1.Write(bBufferBytes, 0, bBufferBytes.Length)
    ...

end sub




3 : Dans le click sur "Envoyer", Utilises le buffer et pas le texte du bouton

Private Sub Button3_Click(sender ....
    ...

     SerialPort1.Write(bBufferBytes, 0, bBufferBytes.Length)

    ...            
End Sub



Il y a d'autres problèmes, mais déjà essayes de faire marcher
l'envoi du buffer vers le port (Que si le port choisi est connecté bien sur)


bye...
Commenter la réponse de yann_lo_san
Messages postés
11
Date d'inscription
lundi 9 mars 2015
Statut
Membre
Dernière intervention
19 mars 2015
0
Merci
salut,
j'ai fait les modification que tu me suggère mais il se passe rien .
le port est bien connecter.

bye.
Commenter la réponse de tinhimahz
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Re,

es tu sur que cette instruction marche ?

If Me.KeyPreview = True Then

    ' write

end if


Essayes de l'enlever car je ne vois pas a quoi elle sert.

Sinon, tu peux essayer aussi de mettre un point d'arret sur cette instruction
(click sur la marge gauche de la ligne dans l'éditeur de code)
Puis lance le mode DEBUG et fais F10 pour avancer pas à pas et visualiser ce qu'il se passe ligne par ligne.

Bon courage,

bye...
Commenter la réponse de yann_lo_san
Messages postés
11
Date d'inscription
lundi 9 mars 2015
Statut
Membre
Dernière intervention
19 mars 2015
0
Merci
bonjour,
oui ça ce bloque a ce niveau, mais je dois recevoir un signal de MCS pour effectuer le transfert.
le MCS est deja programmer pour le transfert recevoir/envoyer il suffi de clique sur F6 sur le terminal opérateurs IHM (dialog 80) pour commencer.
donc les boutons recevoir et envoyer ils doivent attendre cet instruction.
je comprend pas, peut être j'ai pas utiliser la bonne fonction???
ou il faut pas l'utiliser ????
Commenter la réponse de tinhimahz