2014-06-05 1 views
-1

J'essaie de communiquer avec ECUsim 2000 qui est simulateur d'ECU OBD-ll (link). Pourtant, les réponses que je reçois toujours de l'appareil sont quelque chose comme "??" ou "?" (quand j'exécute des programmes comme TouchScan ou OBD Auto Doctor, ils lisent correctement les données pour que l'appareil fonctionne correctement). J'envoie COMAND en C# viaincapable de communiquer avec obd-II

serialPort1.Write("010D\r") 

et je suis signal de réception dans le cas DataReceived de SerialPort comme

message = "Data Received: " + serialPort1.ReadExisting(); 
this.Invoke(new EventHandler(displayText)); 

Je ne maintenant ce que je suis absent. Voici le code source complet

private void Form1_Load(object sender, EventArgs e) 
    { 
     serialPort1.PortName = "COM3"; 
     serialPort1.BaudRate = 115200; 
     serialPort1.Parity = System.IO.Ports.Parity.None; 
     serialPort1.StopBits = System.IO.Ports.StopBits.One; 
     serialPort1.DataBits = 8; 
     serialPort1.Handshake = System.IO.Ports.Handshake.None; 

     serialPort1.Open(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (serialPort1.IsOpen) 
     { 
      serialPort1.Write("010D\r"); 
     } 
    } 

    private void displayText(object sender, EventArgs e) 
    { 
     textBox1.AppendText(message + "\n"); 
    } 

    private void serialPort1_DataReceived(object sender,  System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 
     message = "Data Received: " + serialPort1.ReadExisting(); 
     this.Invoke(new EventHandler(displayText)); 
    } 

paramètres de communication par défaut de ECUsim 2000 sont

Vitesse: 115200 Bits de données: 8 Parité: aucune Bits d'arrêt: 1

protocole

est certifiée ISO 15765 -4 et il y a deux commutateurs sur le périphérique qui sont l'attribut de protocole CAN ID 29/11 bit et CAN Baud Rate 500 kbps/250kbps. Peut-être, le problème est lié à ceux-ci tels qu'il n'y a pas de jeu de communication approprié.

Une autre question -> Existe-t-il un moyen de définir un protocole (comme ISO 15765-4) en communication série?

+0

Le? Les caractères sont produits par Encoding.ASCII en essayant de convertir un non-sens en un vrai caractère ASCII et abandonnant l'espoir parce que les données contiennent des valeurs> 127. Aucun périphérique de port série n'utilise jamais son numéro de produit comme vitesse de transmission. –

+0

Désolé, j'ai modifié le débit en bauds tel qu'il apparaît sur le code. Je pense que l'erreur est due à l'interprétation des données reçues – Splendor

+0

CAN n'utilise pas ASCII, ce n'est pas un protocole de texte. Donc, n'utilisez pas les méthodes SerialPort qui retournent une chaîne, utilisez Read() à la place. –

Répondre

0

Il y a deux problèmes liés au code donné.

1) Il y a deux connecteurs sur l'ECUsim 2000. L'un d'entre eux est le port USB de type B, l'autre est le connecteur de diagnostic (DLC). Si l'on veut se connecter au périphérique via le port USB de type B, le débit en bauds est: 115200. Si DLC est utilisé, le débit en bauds est très probablement soit 9600 ou 38400. Ici, la connexion est faite par l'outil d'analyse (pour mon cas) taux de transmission 38400 a travaillé pour moi.

2) Comme mentionné dans le commentaire, Afin d'obtenir des données, la méthode Read() de SerialPort doit être utilisée. Il peut être utilisé comme le code suivant:

int buffSize = 1024; 
bool cont = true; 
int count = 0; 
byte[] bff = new byte[buffSize]; 
string returnVal = string.Empty; 
count = serialPort1.Read(bff, 0, buffSize); 
returnVal += System.Text.Encoding.Default.GetString(bff, 0, count);