2017-08-07 6 views
0

Je dois gérer une chaîne de quatre moteurs en utilisant un port série. Le manuel utilisateur indique que lors de l'initialisation que je dois envoyer (par exemple) les chaînesC# commande d'envoi via le port série

Z 
1ECHO 
2ECHO 
3ECHO 
4ECHO 

Et me dit de le faire, dans un code que je ne reconnais pas, avec des commandes

PRINT(#128, "Z", #13) 
PRINT(#129, "ECHO", #13) 
PRINT(#130, "ECHO", #13) 
PRINT(#131, "ECHO", #13) 
PRINT(#132, "ECHO", #13) 

To expliquer cela, le manuel ajoute une phrase que je ne comprends pas:

avec les chaînes ci-dessus, vous pouvez initialiser les moteurs via le moteur logiciel, mais un hôte pr ogram doivent envoyer les mêmes commandes avec différents préfixe: 0, 1, 2, 3 et 4 sont en fait 0x80, 0x81, 0x82, 0x83 et 0x84, respectivement. Les équivalents décimaux de valeurs hexadécimaux sont 128, 129 , 130, 131 et 132.

Un collègue a écrit un code de travail dans Visual Basic comme suit:

SerialPort.Output(chr(128) & "Z" & chr(13)) 
SerialPort.Output(chr(129) & "ECHO" & chr(13)) 
SerialPort.Output(chr(130) & "ECHO" & chr(13)) 
SerialPort.Output(chr(131) & "ECHO" & chr(13)) 
SerialPort.Output(chr(132) & "ECHO" & chr(13)) 

J'ai traduit en .NET avec:

SerialPort.Write((char)128 + "Z" + (char)13); 
SerialPort.Write((char)129 + "ECHO" + (char)13); 
SerialPort.Write((char)130 + "ECHO" + (char)13); 
SerialPort.Write((char)131 + "ECHO" + (char)13); 
SerialPort.Write((char)132 + "ECHO" + (char)13); 

Mais cela ne fonctionne pas.

Maintenant, je ne peux pas essayer, mais je me demande si elle peut travailler à réécrire mon code comme ceci:

SerialPort.Write("Z" + (char)13); 
SerialPort.Write("1ECHO" + (char)13); 
SerialPort.Write("2ECHO" + (char)13); 
SerialPort.Write("3ECHO" + (char)13); 
SerialPort.Write("4ECHO" + (char)13); 

Si ça marche, pourquoi ça marche? Et si cela ne fonctionne pas, comment traduire correctement le code de mon collègue?

+0

Bienvenue dans Stack overflow, s'il vous plaît être plus précis avec _ne marche pas_. Est-ce que le programme compile? Est-ce qu'il sort quelque chose sur le port série? Veuillez également commencer par [this] (https://stackoverflow.com/help/mcve). – vasek

+0

Eh bien, la première traduction devrait fonctionner. Je recommande que vous essayez de regarder votre sortie en utilisant quelque chose comme ceci: https://freeserialanalyzer.com/ Il ya longtemps, mais quand j'ai tripoté avec la communication série, j'ai fait un câble renifleur pour surveiller la communication via un port COM secont que j'avais installé: https://www.lammertbies.nl/comm/cable/RS-232-spy-monitor.html –

+0

@HenrikClausen en fait la traduction ne fonctionnera pas et [ces remarques] (https : //msdn.microsoft.com/en-us/library/y2sxhat8 (v = vs.110) .aspx # Anchor_2) explique pourquoi. – vasek

Répondre

0

Vous ne pouvez pas utiliser SerialPort.Write(string) avec un codage par défaut pour l'envoi d'octets> 128 (0x80), pour plus d'informations, voir this. Si vous devez être sûr que vos données correspondent à un protocole binaire, vous devez envoyer des données sous forme de tableau de byte s:

var data = new byte[] { 129, (byte)'E', (byte)'C', (byte)'H', (byte)'O', 13 }; 
SerialPort.Write(data, 0, data.Length); 

Alors vous serez sûr pas de conversion non désirée est effectuée avant de l'envoyer.

+0

Merci, cela fonctionne si j'envoie un tableau! – Andrea