ASCII est un jeu de caractères 7 bits. Il n'y a rien de tel que 0xA0
en ASCII. 63
se trouve être ?
en ASCII - le caractère utilisé lorsqu'une valeur particulière ne peut pas être représentée dans le jeu de caractères donné.
Ne pas lire les données sous forme de données de type lorsqu'elles ne sont pas des caractères. N'utilisez pas ReadExisting
, qui suppose des données de caractères. Au contraire, vous besoin de quelque chose comme ceci:
var buffer = new byte[256];
var bytesRead = sp.Read(buffer, 0, buffer.Length)
// buffer[0..bytesRead-1] now contains all the data read from the port
Bien sûr, vous devrez peut-être lire plusieurs fois pour obtenir l'ensemble du message, ou vous voudrez peut-être en lecture seule une quantité limitée d'octets à la fois, selon la votre protocole fonctionne.
Un emballage SerialPort
simple qui gère pour vous pourrait ressembler à ceci:
class MySerialPort
{
private readonly SerialPort _port;
public MySerialPort(SerialPort port)
{
this._port = port;
}
public byte[] ReadBytes(int amount)
{
var data = new byte[amount];
var offset = 0;
while (amount > 0)
{
var bytesRead = _port.Read(data, offset, amount);
offset += bytesRead;
amount -= bytesRead;
}
return data;
}
}
Selon ce que vous essayez de faire en fait, vous pouvez ajouter un peu de mise en mémoire tampon et ce pas, mais cela fonctionne bien pour le type de protocoles qui sont couramment utilisés sur le port série. Si c'est tout ce dont vous avez vraiment besoin, vous pouvez simplement faire ReadBytes
une méthode d'extension sur SerialPort
. En outre, decimal
est également un nombre décimal. Vous voulez probablement utiliser byte
ou int
à la place.
Lit les octets du port série au lieu de la chaîne. Ou essayez d'utiliser 'Encoding.Default' au lieu de' Encoding.ASCII'. –
Résultat @Alexander Petrov pour 'Encoding.default' était similaire –
Parce que le codage du port série est toujours' Encoding.ASCII'. Vous devriez aussi changer 'sp.Encoding' (idéalement juste après avoir créé l'instance' SerialPort'). ASCII est un jeu de caractères de 7 bits, vous ne pouvez pas représenter des valeurs supérieures à 127. '0xA0' est plus grand que 127, donc il est encodé en 63 -'? '. – Luaan