2017-01-10 4 views
-1

Я пытаюсь отправить данные плавания с платы STM32 на компьютер через UART. Im, отправляющий данные по плаванию через UART как 4 кадра - 4x8бит. Я уже создал функцию, которая преобразует эти кадры обратно в float.C# сохранение данных COMport в файл

Мой вопрос заключается в том, что я должен сделать, чтобы складывать как 1000 поплавков в массив, чтобы впоследствии использовать его - вне Handler.

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

Используйте экземпляр коллекции (например, List), чтобы сохранить полученные данные. 'Список list = new Список ();' и в RxHandler 'list.Add (ToFloat (....));' –

+0

Как я могу ссылаться на «список», когда в RxHandler Ошибка «Требуется ссылка на объект для нестатического поля, метода или свойства «Program.list». – Jejh

+0

. В этой связи вам необходимо наложить некоторое действие протокола (т. е. кадр сообщения с проверкой целостности). В вашем текущем коде не используется ничего для поддержки кадрирования сообщений. потерять байт, и вы начнете преобразовывать неверные данные в значения поплавка мусора. См. 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) через существующий метод ToFloat, вы могли бы использовать File.WriteAllBytes, например.

Если вы хотите сохранить их как удобное для восприятия представление, я думаю, вы захотите положиться на Single.ToString перед использованием, скажем, File.WriteAllText.

+0

Ну, вообще-то я вообще планирую поместить свои поплавки в массив, а затем использовать их для создания сюжета. – Jejh

+0

@Jejh Хорошо, может быть, я запутался в проблеме, которую вы на самом деле пытаетесь решить за пределами своего названия вопроса, тогда «C# сохранение данных COMport в файл». – YSharp

+0

На данный момент я хочу сохранить свои данные в файл – Jejh

 Смежные вопросы

  • Нет связанных вопросов^_^