2016-05-10 3 views
0

Я разрабатываю приложение в WinCE7. Приложение включает в себя последовательный COM-порт и операции ввода-вывода файлов. Во встроенном устройстве подключен последовательный порт. Мне нужно проверить состояние входов на устройстве и сохранить их данные в файле. Допустим, если вход 1 высок, мне нужно написать Input 1 HIGH на последовательном порту и сохранить его в файле.Ошибка записи в файл (fopen) в WinCE7

Теперь, чтобы записать данные в файл Я использую fprintf & fopen функции. Код выглядит следующим образом:

main() 
{ 
    // some code to initialize serial port 

    FILE * fp; 
    fp= fopen ("Logs.txt", "w+"); //-------> create a file named as Logs.txt 
    while(1) 
    { 
    if(Input1 == TRUE) 
    { 
    serialPort.Send("Input 1 HIGH"); 
    fprintf(fp,"%s","Input 1 HIGH"); //-------> saving data in file 
    } 

    if(Input2 == TRUE) 
    { 
    serialPort.Send("Input 2 HIGH"); 
    fprintf(fp,"%s","Input 2 HIGH"); //-------> saving data in file 
    } 
    //same goes for rest of the inputs 
    } 
fclose(fp); //----------> closing the file 
} 

Теперь после записи данных в файл с помощью fprintf, мы должны использовать fclose(), чтобы закрыть файл. Но поскольку я должен постоянно контролировать состояние ввода, которое я использовал в то время как (1), из-за которого мой контроль не достигает значения fclose(fp). Таким образом, файл не закрыт и он поврежден. Когда я открываю файл, чтобы увидеть сохраненные данные, которые он дал мне под ошибкой:

enter image description here

Как правильно использовать flcose() и fprintf() для записи данных в файл.?

ответ

0

Когда ваш старт цикла, и когда это кончится? Я имею в виду не программно, а теоретически? Простейшая вещь, похоже, заключается в изменении условия while. На данный момент он будет бесконечно застрял в цикле while!

Предположим, что ваша программа запущена, и она продолжает работать до тех пор, пока ваше устройство остается подключенным. Поэтому вам необходимо отслеживать какое-либо сообщение или искать какое-либо событие, которое означает, что устройство отключено или остановлено (или что-то подходящее). Это событие или ситуация могут использоваться как флаг (например, TRUE, когда устройство подключено и активно, FALSE, когда устройство отключено или неактивно), а затем использовать это как условие для открытия/записи/закрытия файла.

Кроме того, вместо цикла вы можете использовать таймер или периодическое событие для опроса вашего устройства. Вы можете настроить уровень опроса настолько высоко, насколько вам нравится, в зависимости от точности вашего таймера. Это гарантирует, что ваш код не застрянет в цикле. Скажем, вы вызываете свою функцию для контроля входа при каждом таймере. Поэтому каждый раз, когда срабатывает галочка, вход считывается. И вы можете проверить состояние соединения устройства перед вызовом функции опроса.

поток пошел бы что-то вроде:

Пуск-> Устройство подключено, флаг true-> fOpen-> Запустить таймер
=> Таймер клещевого> флаг == TRUE -> опрос device-> написать to file => (повторяется для каждого тика, если не выполняется сценарий ниже.)

Устройство отключено, флаг FALSE
=> timer tick-> flag == TRUE? NO-> fClose-> Стоп-таймер-> Стоп

Это предполагает, что у вас был какой-то способ обнаружения соединения connect/active или disconnect/inactive. Возможно, SDK устройства имеет определенную форму сообщения или события, что означает это.

+0

Спасибо за объяснение. В настоящее время я открываю файл, чтобы добавить текст, а затем закрыть его в одно и то же время. Поэтому в следующий раз файл откроется для добавления журналов. –

+0

Да, это тоже работает ... Кстати, если количество раз, когда вам нужно писать, очень велико, тогда вам придется многократно открывать и закрывать файл, что скажется на производительности. В любом случае, если все работает, это хорошо. – PRinCEKtd

1

Нет ничего плохого в открытии файла журнала и закрытии каждый раз, когда вы хотите выполнить регистрацию. Это может вызвать проблемы, если цикл while выполняется с очень высокой частотой - это может замедлить ваше приложение. Вот почему вы должны рассмотреть способ как-то закрыть приложение, теперь, насколько я понимаю, вы копируете свой файл журнала во время выполнения вашего приложения - это может вызвать всевозможные проблемы, среди прочего, что ваш файл будет поврежден.

кстати. Вы можете также использовать окна-се родной Logging API, как: CELog, смотрите здесь:

https://msdn.microsoft.com/en-us/library/ee479601.aspx

https://msdn.microsoft.com/en-us/library/ee488587.aspx

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

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