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.
Da Arduino Sigle Bytes senden Sie einzelne Bytes 'ReadByte()' zu lesen. –
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
'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. –