天天看点

嵌入式IOEServer终于开发完成,相应的问题作一个系统阐述(WINCE)

经过近一个月的努力,嵌入式IOEServer终于开发完成,目前仅做了四个驱动,西门子 PPI,CP243;  modbus Rtu/AscII,,TCP;效果比预想的要好,下面就是运行在WinCE上的一个截图。

<a href="http://blog.51cto.com/attachment/201005/160622509.jpg" target="_blank"></a>

下面简单介绍遇到的一些问题

1、关于EVC自编写的GetPrivateProfileString函数

在上一篇文章种我说了,这个函数还挺好使,不过它有很大的Bug,在实际测试种发现,ini文件不能有空行,一旦有空行,它就死掉(进入死循环)

要解决这个问题,目前是这样修改的:

... ...  

   if (nPos == -1)   

   {  

    szTemp = szBuf;  

    szBuf.Empty();  

   }  

   else 

    szTemp = szBuf.Left(nPos);  

    szBuf = szBuf.Right(szBuf.GetLength() - nPos);  

    szBuf.TrimLeft(TEXT("\r\n"));  ---------------------------------&gt; 修改为szBuf.TrimLeft()  

   }    

   szTemp.TrimLeft(TEXT("\t "));  

   szTemp.TrimRight(TEXT("\t "));  

   if (szTemp.GetAt(0) == TEXT('[') &amp;&amp; szTemp.GetAt(szTemp.GetLength() - 1) == TEXT(']'))  

    szTemp = szTemp.Right(szTemp.GetLength() - 1);  

    szTemp = szTemp.Left(szTemp.GetLength() - 1);  

    if (lpAppName == NULL)   

    {  

  return _tcslen( lpReturnedString );                   

    }  

    else if (szTemp.CompareNoCase(lpAppName) == 0)   

  while (1)   

  {  

   if (szBuf.IsEmpty()) {continue; }       

   nPos = szBuf.FindOneOf(TEXT("\r\n"));  

   szBuf.TrimLeft(TEXT("\r\n"));  ---------------------------------&gt; 修改为szBuf.TrimLeft()  

2、关于BuildCommDCB函数

EVC下同样不支持该函数,我自己编写了一个,支持如下的格式:“COM1:9600,n,8,1”

long BuildCommDCB(LPTSTR szMsg,DCB *dcb)  

{  

    long BaudRate=9600,Parity=0,ByteSize=8,StopBits=0;  

 TCHAR strConfig[255];  

 ULONG i,j=0,e=0,lngFlag=0;  

 for(i=0;i&lt;wcslen(szMsg);i++)  

 {  

  if(szMsg[i-1]==_T(':') || szMsg[i]==_T(','))  

        lngFlag=1;  

  }  

  if(lngFlag==1)  

     strConfig[j++]=szMsg[i];  

  if((j&gt;0 &amp;&amp; szMsg[i]==_T(',')) || i==wcslen(szMsg)-1)  

     strConfig[j-((i==wcslen(szMsg)-1) ? 0:1)]=_T('\0');  

     j=0;  

     switch(e++)  

     {  

     case 0:  

              swscanf(strConfig,_T("%ld"),&amp;BaudRate);  

     break;  

     case 1:  

     // 0-4=None,Odd,Even,Mark,Space      

     switch (strConfig[0])  

     case _T('n'):  

     case _T('N'): Parity=0;break;  

     case _T('o'):  

     case _T('O'): Parity=1;break;  

     case _T('e'):  

     case _T('E'): Parity=2;break;  

        case _T('m'):  

     case _T('M'): Parity=3;break;  

     case _T('s'):  

     case _T('S'): Parity=4;break;  

     }  

     case 2:  

     swscanf(strConfig,_T("%ld"),&amp;ByteSize);  

     case 3:  

     // 0,1,2 = 1, 1.5, 2                 

     if(wcscmp(strConfig,_T("1"))==0)  

      StopBits=0;  

     else if(wcscmp(strConfig,_T("1.5"))==0)  

      StopBits=1;  

     else if(wcscmp(strConfig,_T("2"))==0)  

      StopBits=2;  

     break;       

 }  

 if (e==4)  

        dcb-&gt;BaudRate=BaudRate;  

  dcb-&gt;Parity=(BYTE)Parity;  

  dcb-&gt;ByteSize=(BYTE)ByteSize;  

  dcb-&gt;StopBits=(BYTE)StopBits;  

  return 0;  

 else 

  return -1;  

}  

3、关于sleep(0)

在VC编程中,看到有关sleep的有关介绍,但实际觉得并没有什么用处,但是在WinCE下确大显神奇,在线程中添加一个sleep(0),系统变得轻快多了。

4、关于WaitForMultipleObjects

不知为什么把WaitForMultipleObjects的第4个参数修改为TRUE,怎么都不好使,这句代码在PC上非常好使,不知道为什么在EVC始终有问题(FALSE没有问题),最后只好修改为WaitForSingleObject了。

//if (WaitForMultipleObjects(G_IOMRun.YFThread.GetSize()-1,G_IOMRun.m_IsExitEvent,TRUE,1000)!=WAIT_OBJECT_0)  

     for(i=0;i&lt;G_IOMRun.YFThread.GetSize()-1;i++)  

     if(WaitForSingleObject(G_IOMRun.m_IsExitEvent[i],1000)!=WAIT_OBJECT_0)  

      lngWaitNum++;  

5、共享内存的创建

在对话框窗体的OnInitDialog事件中,不能创建共享内存(我是指在这里动态调用的DLL,DLL初始化中有创建共享内存的代码),只好定义了一个一毫秒的时钟,解决了该问题(不知道为什么在另一款WinCE操作系统上又出了问题)

先写这些,还有写问题,以后在一一写来(以上问题只是我个人经验,如有不对之处希望高手指点)

本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323789,如需转载请自行联系原作者