NB: LE SUJET à été modifier car de 1 j'avais aucune solution ni réponse dans ce forum, du coup j'ai cru que j'ai mal expliqué ce que je veux c'est pour ça que j'ai modifier pour faire un autre. Voila
Bonjour,
je travaille sur un petit programme, je devrais envoyer des un message à une carte et recevoir la réponse, Le message doit être de ce type
et je veux lire cette information
Le code pour envoyer le message
public void senderUdpClient(char message_Type, byte Command_Class, byte command_code,Int32 argument_Comm)
{
string serverIP = "192.168.2.11";
int sendPort = 40960;
List<char> tx_buffer2 = new List<char>();
byte Cs = 0;
//BufferSend
tx_buffer2.Add(message_Type);
tx_buffer2.Add((char)Command_Class);
tx_buffer2.Add((char)command_code);
tx_buffer2.Add((char)argument_Comm);
for (int i = 0; i < tx_buffer2.Count; i++)
{
Cs += Convert.ToByte(tx_buffer2[i]);
}
tx_buffer2.Add((char)Cs);
UdpClient senderClient = new UdpClient();
sendEndPoint = new IPEndPoint(IPAddress.Parse(serverIP), sendPort);
try
{
senderClient.Connect(this.sendEndPoint);
}
catch (Exception err)
{
MessageBox.Show(err.ToString());
}
Byte[] sendBytes = Encoding.ASCII.GetBytes(tx_buffer2.ToArray());
senderClient.Send(sendBytes, sendBytes.Length);
senderClient.Close();
MessageBox.Show("Message Sent");
}
Le code pour la lecture
public void readerUdpClient()
{
string serverIP = "192.168.2.11";
int receivePort = 40961;
try
{
var remoteEP = new IPEndPoint(IPAddress.Parse(serverIP), receivePort);
UdpClient readerClient = new UdpClient();
readerClient.Connect(remoteEP);
byte[] bytesReceived = readerClient.Receive(ref remoteEP);
}
catch (Exception err)
{
MessageBox.Show(err.ToString());
}
}
Charmant. Vider son message de son contenu (quelqu'en soit la raison) n'est pas très élégant, et surtout s'il s'agit d'un sujet où tu poses une question… La moindre des choses serait de remettre le premier message comme il était à l'origine et de poster la solution, puisque c'est résolu, afin de partager ladite solution.
Pas d'aide concernant le code par MP, le forum est là pour ça :)
@Lamecarlarte ne cherche pas, je viens de regarder sur Developpez, le même topic a été créé et il est dans le même état, donc il/elle ne reviendra pas.
Bonjour, effectivement supprimer ses message n'est pas chose à faire, je recopie ci après le message d'origine.
MouadLyriciste a écrit:
Bonjour, je travaille sur un petit programme, je devrais envoyer des un message à une carte et recevoir la réponse,
Je veux quelqu'un qui peut m'aider à bien construire mon message en respectant bien la structure donnée (string sendString = "Message!"
public static void senderUdpClient()
{
UdpClient senderClient = new UdpClient();
senderClient.Connect(sendEndPoint);
string sendString = "Message!";
Byte[] sendBytes = Encoding.ASCII.GetBytes(sendString);
Thread t = new Thread(() => {
while (true)
{
senderClient.Send(sendBytes, sendBytes.Length);
Thread.Sleep(1000);
}
});
t.Start();
}
le message que je dois envoyer dois être de cette structure
et je veux lire cette information
Ma Classe UDPHandler
class UDPHandler
{
private int receivePort, sendPort;
private string serverIP;
public static IPEndPoint sendEndPoint, receiveEndPoint;
public UDPHandler(string serverIP, int receivePort, int sendPort)
{
this.serverIP = serverIP;
this.receivePort = receivePort;
this.sendPort = sendPort;
sendEndPoint = new IPEndPoint(IPAddress.Parse(this.serverIP), this.sendPort);
receiveEndPoint = new IPEndPoint(IPAddress.Parse(this.serverIP), this.receivePort);
}
public static void senderUdpClient()
{
UdpClient senderClient = new UdpClient();
senderClient.Connect(sendEndPoint);
string sendString = "Message!";
Byte[] sendBytes = Encoding.ASCII.GetBytes(sendString);
Thread t = new Thread(() => {
while (true)
{
senderClient.Send(sendBytes, sendBytes.Length);
Thread.Sleep(1000);
}
});
t.Start();
}
public static void readerUdpClient()
{
UdpClient readerClient = new UdpClient();
IPEndPoint localEndpoint = new IPEndPoint(IPAddress.Any, 3000);
readerClient.Client.Bind(localEndpoint); //Tried both Connect and Bind
//readerClient.Connect(this.receiveEndPoint);
Thread t = new Thread(() => {
Console.WriteLine("Awaiting data from server...");
var remoteEP = new IPEndPoint(IPAddress.Any, 3000);
byte[] bytesReceived = readerClient.Receive(ref remoteEP);
//The above throws: System.InvalidOperationException: 'You must call the Bind method before performing this operation'
Console.WriteLine("Received data from " + remoteEP.ToString());
});
t.Start();
}
}<br><br>
Ma form1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
string serverIP = "192.168.2.11";
int sendPort = 40960;
int receivePort = 40961;
UDPHandler ObjHundler = new UDPHandler(serverIP, receivePort, sendPort);
}
private void button1_Click(object sender, EventArgs e)
{
UDPHandler.senderUdpClient();
UDPHandler.readerUdpClient();
}
}
NB: LE SUJET à été modifier car de 1 j'avais aucune solution ni réponse dans ce forum, du coup j'ai cru que j'ai mal expliqué ce que je veux c'est pour ça que j'ai modifier pour faire un autre. Voila
Le code en C# si quelqu'un en a besoin
// Calcul CheckSum
// We know the message plus the checksum has length 12
var packedMessage2 = new byte[12];
// We use the new Span feature
var span = new Span<byte>(packedMessage2);
// We can directly set the single bytes
span[0] = message_Type;
span[1] = Command_Class;
span[2] = command_code;
// The pack is <, so little endian. Note the use of Slice: first the position (3 or 7), then the length of the data (4 for int)
BinaryPrimitives.WriteInt32LittleEndian(span.Slice(3, 4), argument1);
BinaryPrimitives.WriteInt32LittleEndian(span.Slice(7, 4), argument2);
// The checksum
// The sum is modulo 255, because it is a single byte.
// the unchecked is normally useless because it is standard in C#, but we write it to make it clear
var sum = unchecked((byte)packedMessage2.Take(11).Sum(x => x));
// We set the sum
span[11] = sum;
// Without checksum
Console.WriteLine(string.Concat(packedMessage2.Take(11).Select(x => $@"\x{x:x2}")));
// With checksum
Console.WriteLine(string.Concat(packedMessage2.Select(x => $@"\x{x:x2}")));
Il te manque l'argument 2 qui fait que ton message est trop court.
Ton checksum non plus, il doit seulement prendre les 11 derniers bits (byte veut dire octet, un octet contient 8 bits)
11 bytes, soit les 11 octets qui composent le message. le check sum est sur 1 octet (8bits)
La commande est mal envoyée si tu ne reçois pas de réponse. Pourquoi tu envoies le caractère '1' (soit 0x31) pour le 1er octet et la valeur 1 pour le second ? les 2 sont de même type, non ?
Le message à envoyer devrait être 1, 1, 0x22, 0x00,0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24 (qui est le CRC=0x22+1+1+8*0=0x24); les argument sont à mettre à 0 (si il faut les transmettre) (attention les arguments sont sur 32 bits donc 4 octets chacun)
Il te manque l'argument 2 qui fait que ton message est trop court.
Ton checksum non plus, il doit seulement prendre les 11 derniers bits (byte veut dire octet, un octet contient 8 bits)
11 bytes, soit les 11 octets qui composent le message. le check sum est sur 1 octet (8bits)
La commande est mal envoyée si tu ne reçois pas de réponse. Pourquoi tu envoies le caractère '1' (soit 0x31) pour le 1er octet et la valeur 1 pour le second ? les 2 sont de même type, non ?
Le message à envoyer devrait être 1, 1, 0x22, 0x00,0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24 (qui est le CRC=0x22+1+1+8*0=0x24); les argument sont à mettre à 0 (si il faut les transmettre) (attention les arguments sont sur 32 bits donc 4 octets chacun)
Oh punaise, j'avais mal lu xD
Mais de toute façon le code n'était pas bon.
Mais ne cherche pas de réponse, il/elle a trouvé du code sur internet et la traduit en C# sans se poser de question
Il te manque l'argument 2 qui fait que ton message est trop court.
Ton checksum non plus, il doit seulement prendre les 11 derniers bits (byte veut dire octet, un octet contient 8 bits)
11 bytes, soit les 11 octets qui composent le message. le check sum est sur 1 octet (8bits)
La commande est mal envoyée si tu ne reçois pas de réponse. Pourquoi tu envoies le caractère '1' (soit 0x31) pour le 1er octet et la valeur 1 pour le second ? les 2 sont de même type, non ?
Le message à envoyer devrait être 1, 1, 0x22, 0x00,0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24 (qui est le CRC=0x22+1+1+8*0=0x24); les argument sont à mettre à 0 (si il faut les transmettre) (attention les arguments sont sur 32 bits donc 4 octets chacun)
Enfin une réponse pertinente et bien expliqué, Merci à vous
Udp Socket send receive
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Pas d'aide concernant le code par MP, le forum est là pour ça :)