2017-01-10 9 views
-1

私はSTM32ボードからUART経由でコンピュータにフロートデータを送信しようとしています。 私はUART経由で4フレーム - 4x8bitsとしてフロートデータを送信しています。私はすでにこれらのフレームを浮動小数点に変換する関数を作成しました。c#COMportデータをファイルに保存

私の質問は、1000浮動小数点型のようにスタックに入れて、後で使用できるようにするためです。既存のToFloat方法スルー

class Program 
{ 
    static void Main() 
    { 
     SerialPort com = new SerialPort("Com3"); 

     com.BaudRate = 9600; 
     com.Parity = Parity.None; 
     com.StopBits = StopBits.One; 
     com.DataBits = 8; 
     com.Handshake = Handshake.None; 
     com.RtsEnable = true; 

     com.DataReceived += new SerialDataReceivedEventHandler(RxHandler); 
     com.Open(); 

     Console.WriteLine("Press any key to continue..."); 
     Console.ReadKey(); 
     com.Close(); 
    } 

    private static void RxHandler(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort sp = (SerialPort)sender; 
     int bytes = sp.BytesToRead; 
     byte[] buffer = new byte[bytes]; 
     sp.Read(buffer, 0, bytes); 
     Console.WriteLine(ToFloat(new byte[] { buffer[0], buffer[1], buffer[2], buffer[3] })); 
    } 

    static float ToFloat(byte[] input) 
    { 
     byte[] fArray = new[] { input[0], input[1], input[2], input[3] }; 
     return BitConverter.ToSingle(fArray, 0); 
    } 
} 
+0

は、受信したデータを格納するコレクション(例えばリスト)のインスタンスを使用します。 –

+0

RxHandler内で "list"を参照するにはどうすればいいですか? エラー "オブジェクトの参照が必要です(リスト参照は必要ありません):リスト list = new List ();およびRxHandler' list.Add(ToFloatメソッドまたはプロパティ 'Program.list' – Jejh

+0

このデータリンクには何らかのプロトコル(つまり、完全性チェック付きのメッセージフレーム)を課す必要があります。現在のコードでは、メッセージフレーミングを維持するために何も使用されていないようです。あなたは1バイトを失います。そして、ミスアライメントされたデータをガーベッジフロート値に変換し始めます.1つのスキームについては、http://stackoverflow.com/questions/16177947/identification-of-packets-in-a-byte-streamを参照してください。 – sawdust

答えて

0

ここコード部分:

class Program 
{ 
    private static List<float> list = new List<float>(); 
    static void Main() { 
     // see your code 
     // ...... 
     com.Close(); 

     // Write list to file 
     System.IO.File.WriteAllLines("data.txt", list.Select(p => p.ToString())); 
     // convert list to array 
     float[] floatArray = list.ToArray(); 
    } 

    private static void RxHandler(object sender, SerialDataReceivedEventArgs e) { 
     // see your code 
     // ...... 
     sp.Read(buffer, 0, bytes); 

     // store float in variable 
     float f = ToFloat(new byte[] { buffer[0], buffer[1], buffer[2], buffer[3] })); 
     Console.WriteLine(f); 
     // add float to list 
     list.Add(f); 
    } 
0

あなたが気にすべてがこのような(すなわち、System.Single値など)として、それらを検証した後、ディスク上の山車バイトを保存している場合は、インスタンスのFile.WriteAllBytesを使用することができます。

人間が判読可能な表現で保存する場合は、File.WriteAllTextなどを使用する前にSingle.ToStringに頼ってください。私はファイルにフロートを保存するために添加

+0

まあ、一般的に私はフロートを配列に配置し、それを使ってプロットを作成することを一般的に計画しています。 – Jejh

+0

@Jejh [OK]を、おそらくあなたはあなたの質問のタイトルを超えて解決しようとしている問題で混乱して、 "C#COMportデータをファイルに保存する"。 – YSharp

+0

今のところデータをファイルに保存したい – Jejh

関連する問題