2017-03-03 27 views
0

私はCOMポートからデータのストリームを持っています。このストリームは30バイトのセットで構成されています。最初の26バイトは情報であり、最後の4バイトは0xFFFのセットです。たとえば、配列のセットは[0xFF,0x5A,0x44,0x15,...,0x5F,0xFF,0xFF,0xFF,0xFF]です。最初の26バイトには、同様のシーケンスを得る可能性はない。
したがって、私はC#で "until until"を読むためのメソッドを見つけません。 私は、シリアルデータを読み取るために使用するC#のコードの一部は次のとおりです。C#のシリアルポート、バイトシーケンスまで読み取り

public static int count; 
    public static void Main() 
    { 
     SerialPort mySerialPort = new SerialPort("COM8"); 

     mySerialPort.BaudRate = 250000; 
     mySerialPort.Parity = Parity.None; 
     mySerialPort.StopBits = StopBits.One; 
     mySerialPort.DataBits = 8; 

     mySerialPort.Handshake = Handshake.None; 
     mySerialPort.DtrEnable = true; 
     mySerialPort.RtsEnable = true; 
     mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 

     mySerialPort.Open(); 

     count = 0; 

     Console.WriteLine("Press any key to continue..."); 
     Console.WriteLine(); 

     Console.ReadKey(); 
     mySerialPort.Close(); 
    } 


    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort sp = (SerialPort)sender; 
     string indata = sp.ReadExisting(); 
     count++; 
    } 

List<> 26の興味深いバイトを得るために別の方法はありますか?データがArduino上にあり、Arduinoコードを編集できることを考慮すると、Arduinoは約800バイトを1秒ごとに送信します。 Arduinoのコード、あなたが興味を持っている場合、(Arduinoのための下で実行現時点では)次のとおりです。

#define MAX_ADC_RESOLUTION 12 

int val; 
void setup() { 


Serial.begin(250000); 

analogReadResolution(MAX_ADC_RESOLUTION); // 

    adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX*2, 4); //~220000 samples per second, A/D readings OK 

val = 0; 


} 


void loop() { 

int start = millis(); 
int num_samples = 0; //This identify the sample frequency 

while(millis() - start < 1000) 
{ 


    for(int channel=0;channel<12;channel++){ //loop for each analog (0-11) 

    val = analogRead(channel); 
    val++; 
    Serial.write((unsigned char)((val & 0xFF00) >> 8)); 
    Serial.write(((unsigned char)(val & 0x00FF)));  
    } 
    Serial.write((unsigned char)((num_samples & 0xFF00) >> 8)); 
    Serial.write(((unsigned char)(num_samples & 0x00FF))); 
    Serial.write(0xFF); 
    Serial.write(0xFF); 
    Serial.write(0xFF); 
    Serial.write(0xFF); 

    num_samples++; 
} 


} 

編集私の問題何より良い説明するために:私は、バッファの単純長さを設定した場合

読んで私は入ってくる流れの一部を得る。したがって、終了制御バイトはバイトの配列のどこにでも置くことができます(通常、私は0x44,0x53、...、0xFF、0xFF、0xFF、0xFF、..、0x55を受け取ります)。さらに、0x22、...、0x00,0xFF、0xFF、0xFF、0xFF、0xFFのセットを受け取ったとします。それは可能で、私のソフトウェアは最後のバイトをカットします。

+0

[PInvokeSerialPort](https://github.com/ebraminio/PInvokeSerialPort)を強く推奨します.1バイトごとに1つのイベントが発生し、.netに組み込まれているイベントよりも安定しています。 –

+0

読み取ったデータをバッファリングする必要があるため、30バイトのチャンクで検査できます。詳細については、重複したマークを参照してください。https://stackoverflow.com/questions/16439897/serialport-readbyte-int32-int32-is-not-blocking-but-i-want-it-to-how-do、 https://stackoverflow.com/questions/24136264/c-sharp-serialport-not-receiving-all-the-bytes-in-a-single-transmission、https://stackoverflow.com/questions/13417442/serialport- c-sharp-splitting-frameの通信、https://stackoverflow.com/questions/2604932/receiving-messages-part-by-part-from-serial-port-using-c-sharp –

+0

私が設定した場合バッファリングされた読取りの単純な長さは、着信フローの一部を取得します。したがって、終了制御バイトは、バイトの配列のどこにでも置くことができます(例えば、通常は0x44,0x53、...、0xFF、0xFF、0xFF、0xFF、..、0x55を受け取ります) – youngz

答えて

0

なぜあなたは、このようにちょっと読んでは使用しないでください:

byte[] buffer = new byte[30]; 
sp.Read(buffer, 0, 30); 

あなたはバイトの配列を取得し、あなたが必要としない/必要な値をテストすることができますこの方法。

+0

読み取りが完了するとどうなりますか何らかの理由で残りの10個を保持したまま、20バイトしか読めませんか? –

関連する問題