2009-07-24 11 views
2

Je souhaite écrire au serialport com1C#: SerialPort communication

C'est la commande pour l'initialisation ..

Quand j'écris un tableau de caractères ou tableau d'octets

c[0] = (char)01;// 
c[1] = (char)00; 
c[2] = (char)00; 
c[3] = (char)02; 
c[4] = (char)37; 
c[5] = (char)30; 
c[6] = (char)04; 
serialPort 1.Write(c, 0, c.Length); 

byte[] bb1 = System.Text.Encoding.Default.GetBytes(c); 

Je peux voir dans le moniteur de port série: 01 00 00 02 25 1E 04 évidemment 37 est converti en 25 et 30 à 1E ... Comment passer 37 et 30 et non des valeurs hexagonales ... je l'ai essayé différentes façons ...

Répondre

0

Si vous voulez passer 37 dans l'utilisation hex 0x37 au lieu de 37.

+1

« Comment passer i 37 et 30 et * not * hex values ​​" – samoz

+2

Oui, je l'ai remarqué. Cependant, je pensais que c'était peut-être possible, que l'entrée désirée est donnée en hexa et Kal ne l'a pas remarqué. – maciejkow

+2

Fondamentalement la même chose que la plupart des autres réponses, pourquoi les downvotes? –

1

Vous êtes passant 37 et 30, pas des valeurs hexadécimales.

Parlez-vous de affichant valeurs hexadécimales?

Si c'est le cas, qu'utilisez-vous pour afficher la sortie du port série? Si ce n'est pas quelque chose que vous avez écrit, c'est peut-être la façon dont le programme se comporte.

2

Le problème ici est que vous avez spécifié les valeurs à envoyer en décimal et les afficher en hexadécimal. Évidemment, il y aura des différences.

Pour résoudre ce problème, modifiez votre code pour spécifier les valeurs en hexadécimal plutôt que par préfixer chaque valeur avec 0x, comme ceci:

c[0] = (char)0x01;// 
c[1] = (char)0x00; 
c[2] = (char)0x00; 
c[3] = (char)0x02; 
c[4] = (char)0x37; 
c[5] = (char)0x30; 
c[6] = (char)0x04; 
serialPort1.Write(c, 0, c.Length); 

Ensuite, vous verrez les mêmes valeurs dans la sortie que ceux que vous attendez.

Voir aussi @Guffa s answer qui montre une meilleure façon d'initialiser un tableau, au moins si vous utilisez C# 3.5.

+0

L'initialisation d'un tableau fonctionne déjà en C# 2, en C# 3 vous pouvez omettre la partie "new byte []". – Guffa

7

Le moniteur de port série affiche les valeurs en hexadécimal, de sorte qu'elles correspondent exactement aux valeurs que vous envoyez. Il n'y a pas de conversion en cours, la valeur décimale 37 est 25 en hexadécimal, et la valeur décimale 30 est 1E en hexadécimal.

Utilisez la notation hexadécimale (0x) pour les valeurs littérales lorsque vous créez le tableau, vous voyez que les valeurs sortent comme prévu dans le moniteur de port série:

byte[] c = new byte[] { 
    0x01, 
    0x00, 
    0x00, 
    0x02, 
    0x37, 
    0x30, 
    0x04 
}; 

serialPort 1.Write(c, 0, c.Length);