在 WinCE7 中写入文件 (fopen) 时出错

Error writing to file (fopen) in WinCE7

我正在WinCE7 中开发一个应用程序。该应用程序包括串行 com 端口和文件 IO 操作。有一个嵌入式设备连接到串行端口。我需要检查设备上的输入状态并将其详细信息保存在文件中。比方说,如果输入 1 为高电平,那么我需要在串口上写入 Input 1 HIGH,并将其保存在文件中。

现在要在文件中写入数据,我正在使用 fprintffopen 函数。代码如下所示:

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()关闭文件。但是由于我必须持续监视我使用 while(1) 的输入状态,因此我的控制没有达到 fclose(fp)。因此,该文件未关闭并且已损坏。当我打开文件查看保存的数据时,出现以下错误:

如何正确使用flcose()fprintf()向文件写入数据?

每次要记录时打开和关闭日志文件都没有问题。如果您的 while 循环以非常高的频率执行,它可能会导致问题 - 它可能会减慢您的应用程序。这就是为什么您应该考虑以某种方式关闭您的应用程序的原因,据我了解,您在执行应用程序时复制了您的日志文件——这可能会导致各种问题——其中包括您的文件将被损坏。

顺便说一句。您还可以使用 windows-ce 本机日志记录 api,例如:CeLog,请参阅此处:

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

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

你的循环什么时候开始,什么时候结束?我的意思是,不是编程上的,而是理论上的?最简单的事情似乎是修改 while 条件。到现在为止,会一直卡在while循环里!

让我们假设您的程序是 运行,并且只要您的设备保持连接,它就会一直运行 运行。因此,您需要监视一些消息或查找一些表示设备已断开连接或停止(或任何适当的)的事件。此事件或情况可用作标志(例如,当设备已连接并处于活动状态时为 TRUE,当设备断开连接或处于非活动状态时为 FALSE),然后将其用作 open/write/close 文件的条件。

此外,您可以使用计时器或周期性事件来轮询您的设备输入,而不是循环。您可以根据计时器的准确性将轮询率调整到任意高。这将确保您的代码不会陷入循环。比如说,你调用你的函数来监视每个计时器滴答时的输入。因此每次触发 tick 事件时,都会读取输入。并且您可以在调用轮询功能之前检查设备的连接情况。

流程会是这样的:

Start->Device connected, flag TRUE->fOpen->Start timer
=>timer tick->flag == TRUE?->poll device->write to file=>(重复每个滴答,除非发生以下情况。)

设备断开连接,标记 FALSE
=>计时器滴答->标志==真? NO->fClose->停止定时器->停止

这假设您有某种方法可以检测设备 connect/active 与 disconnect/inactive 情况。也许设备 SDK 有某种形式的消息或事件表示这一点。