2016-12-22 7 views
1

Ich habe ein Arduino, die auf der seriellen Schnittstelle einige Informationen senden, die durch analoge Pin enthüllt werden. Wie auch immer, in dem Arduino-Code (den ich nicht ändern kann) wird Serial.write() anstelle von Serial.print() verwendet, um einen Puffer von char zu drucken. Als Konsequenz, wenn ich in meiner C# -Software die Informationen mit einem "einfachen" ReadLine() lese, sind die Daten unverständlich. Wie kann ich diese Art von Daten mit C# lesen?Lesen Sie arduino Serial.Write mit C#

Es ist der Code Arduino:

#include <compat/deprecated.h> 
#include <FlexiTimer2.h> 

#define TIMER2VAL (1024/256)  // 256Hz - frequency      
volatile unsigned char myBuff[8]; 
volatile unsigned char c=0; 
volatile unsigned int myRead=0; 
volatile unsigned char mych=0; 
volatile unsigned char i; 

void setup() { 
pinMode(9, OUTPUT); 

noInterrupts(); 

myBuff[0] = 0xa5; //START 0 
myBuff[1] = 0x5a; //START 1 
myBuff[2] = 2;  //myInformation 
myBuff[3] = 0;  //COUNTER 
myBuff[4] = 0x02; //CH1 HB 
myBuff[5] = 0x00; //CH1 LB 
myBuff[6] = 0x02; //CH2 HB 
myBuff[7] = 0x00; //CH2 LB 
myBuff[8] = 0x01; //END 


    FlexiTimer2::set(TIMER2VAL, Timer2); 
FlexiTimer2::start(); 

    Serial.begin(57600); 
interrupts(); 
} 

void Timer2() 
{ 
    for(mych=0;mych<2;mych++){ 
    myRead= analogRead(mych); 
    myBuff[4+mych] = ((unsigned char)((myRead & 0xFF00) >> 8)); // Write HB 
    myBuff[5+mych] = ((unsigned char)(myRead & 0x00FF)); // Write LB 
    } 

    // SEND 
    for(i=0;i<8;i++){ 
    Serial.write(myBuff[i]); 
    } 

    myBuff[3]++; 

} 

void loop() { 

__asm__ __volatile__ ("sleep"); 

} 

Und dies ist die C# Methode, die

public void StartRead() 
    { 
     msp.Open(); //Open the serial port 

     while (!t_suspend) 
     { 
      i++; 
      String r = msp.ReadLine(); 
      Console.WriteLine(i + ": " + r); 
     } 
    } 

EDIT aus seriellen Port gelesen: Ich möchte ein Array von string als Ausgabe, die der Daten entsprechen, von Arduino-Ausgabe. Wenn ich alles als Array von Byte aufzeichne, habe ich nicht die Information über Start und Ende des Arrays. Ich kann den Code als bearbeiten:

public void StartRead() 
    { 
     msp.Open(); //Open the serial port 
     ASCIIEncoding ascii = new ASCIIEncoding(); 
     while (!t_suspend) 
     { 
      i++; 
      int r = msp.ReadByte(); 
      String s = ascii.getString((byte)r); // here there is an error, it require an array byte[] and not a single byte 
      Console.WriteLine(i + ": " + r); 
     } 
    } 

Wie ich den gleichen Arduino-Array-Wert haben kann (aber als String) in meiner C# Software, wenn man bedenkt, dass der Ausgangswert jedes Mal 0xA5 ist und das Ende ist 0x01.

+0

Da Arduino Sigle Bytes senden Sie einzelne Bytes 'ReadByte()' zu lesen. –

+0

Ok, aber die Ausgabe ist ein 'char'. Wenn ich 'ReadByte()' verwende, gibt es eine ganze Zahl zurück, und ich weiß nicht, wie man diese ganze Zahl in ein Zeichen umwandelt. – youngz

+0

'ReadLine()' liest eine Zeile, die mit einem Zeilenvorschubzeichen endet. Sie senden gerade 8 Bytes, die nicht unbedingt alle druckbaren Zeichen sind, also weiß ich nicht, warum Sie erwarten, dass es verständlich ist. –

Antwort

1

Arduino sendet ein Telegramm von mehreren Bytes. Sie können es in eine Byte-Array zu lesen:

byte[] telegram = byte[msp.BytesToRead]; 
msp.Read(telegram, 0, msp.BytesToRead); 

Um die Daten aus dem Byte-Array erhalten Sie die Bytes zu interpretieren (siehe Beispiel unten). Natürlich könnte man einen String aus den Eigenschaften der Telegram Klasse erstellen:

class Telegram { 
    public Telegram(byte[] tel) { 
     // Check start bytes (0xa5, 0x5a); 
     Info = tel[2]; 
     Counter = tel[3]; 
     Channel1 = BitConverter.ToInt16(new byte[] { tel[5], tel[4] }, 0); // Switch lo/hi byte 
     Channel2 = BitConverter.ToInt16(new byte[] { tel[7], tel[6] }, 0);// Switch lo/hi byte 
     // check tel[8] == 1 for end of telegram 
    }  
    public int Info { get; private set; } 
    public int Counter { get; private set; } 
    public int Channel1 { get; private set; } 
    public int Channel2 { get; private set; } 
}