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

 

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

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

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

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

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

  1. ... ...  
  2.  
  3.    if (nPos == -1)   
  4.    {  
  5.     szTemp = szBuf;  
  6.     szBuf.Empty();  
  7.    }  
  8.    else 
  9.    {  
  10.     szTemp = szBuf.Left(nPos);  
  11.     szBuf = szBuf.Right(szBuf.GetLength() - nPos);  
  12.     szBuf.TrimLeft(TEXT("\r\n"));  ---------------------------------> 修改为szBuf.TrimLeft()  
  13.    }    
  14.    szTemp.TrimLeft(TEXT("\t "));  
  15.    szTemp.TrimRight(TEXT("\t "));  
  16.    if (szTemp.GetAt(0) == TEXT('[') && szTemp.GetAt(szTemp.GetLength() - 1) == TEXT(']'))  
  17.    {  
  18.     szTemp = szTemp.Right(szTemp.GetLength() - 1);  
  19.     szTemp = szTemp.Left(szTemp.GetLength() - 1);  
  20.     if (lpAppName == NULL)   
  21.     {  
  22.   return _tcslen( lpReturnedString );                   
  23.     }  
  24.     else if (szTemp.CompareNoCase(lpAppName) == 0)   
  25.     {  
  26.   while (1)   
  27.   {  
  28.    if (szBuf.IsEmpty()) {continue; }       
  29.    nPos = szBuf.FindOneOf(TEXT("\r\n"));  
  30.    if (nPos == -1)   
  31.    {  
  32.     szTemp = szBuf;  
  33.     szBuf.Empty();  
  34.    }  
  35.    else 
  36.    {  
  37.     szTemp = szBuf.Left(nPos);  
  38.     szBuf = szBuf.Right(szBuf.GetLength() - nPos);  
  39.    szBuf.TrimLeft(TEXT("\r\n"));  ---------------------------------> 修改为szBuf.TrimLeft()  
  40.    }  
  41.  
  42. ... ...  
  43.  

2、关于BuildCommDCB函数

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

  1. long BuildCommDCB(LPTSTR szMsg,DCB *dcb)  
  2. {  
  3.     long BaudRate=9600,Parity=0,ByteSize=8,StopBits=0;  
  4.  TCHAR strConfig[255];  
  5.  ULONG i,j=0,e=0,lngFlag=0;  
  6.  for(i=0;i<wcslen(szMsg);i++)  
  7.  {  
  8.   if(szMsg[i-1]==_T(':') || szMsg[i]==_T(','))  
  9.   {  
  10.         lngFlag=1;  
  11.   }  
  12.           
  13.   if(lngFlag==1)  
  14.   {  
  15.      strConfig[j++]=szMsg[i];  
  16.   }  
  17.           
  18.   if((j>0 && szMsg[i]==_T(',')) || i==wcslen(szMsg)-1)  
  19.   {  
  20.      strConfig[j-((i==wcslen(szMsg)-1) ? 0:1)]=_T('\0');  
  21.      j=0;  
  22.      switch(e++)  
  23.      {  
  24.      case 0:  
  25.               swscanf(strConfig,_T("%ld"),&BaudRate);  
  26.      break;  
  27.      case 1:  
  28.      // 0-4=None,Odd,Even,Mark,Space      
  29.      switch (strConfig[0])  
  30.      {  
  31.      case _T('n'):  
  32.      case _T('N'): Parity=0;break;  
  33.      case _T('o'):  
  34.      case _T('O'): Parity=1;break;  
  35.      case _T('e'):  
  36.      case _T('E'): Parity=2;break;  
  37.         case _T('m'):  
  38.      case _T('M'): Parity=3;break;  
  39.      case _T('s'):  
  40.      case _T('S'): Parity=4;break;  
  41.      }  
  42.      break;  
  43.      case 2:  
  44.      swscanf(strConfig,_T("%ld"),&ByteSize);  
  45.      case 3:  
  46.      // 0,1,2 = 1, 1.5, 2                 
  47.      if(wcscmp(strConfig,_T("1"))==0)  
  48.      {  
  49.       StopBits=0;  
  50.      }  
  51.      else if(wcscmp(strConfig,_T("1.5"))==0)  
  52.      {  
  53.       StopBits=1;  
  54.      }  
  55.      else if(wcscmp(strConfig,_T("2"))==0)  
  56.      {  
  57.       StopBits=2;  
  58.      }  
  59.      break;       
  60.      }  
  61.   }  
  62.  }  
  63.  
  64.  if (e==4)  
  65.  {  
  66.         dcb->BaudRate=BaudRate;  
  67.   dcb->Parity=(BYTE)Parity;  
  68.   dcb->ByteSize=(BYTE)ByteSize;  
  69.   dcb->StopBits=(BYTE)StopBits;  
  70.   return 0;  
  71.  }  
  72.  else 
  73.  {  
  74.   return -1;  
  75.  }  
  76. }  
  77.  

3、关于sleep(0)

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

4、关于WaitForMultipleObjects

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

  

  1. //if (WaitForMultipleObjects(G_IOMRun.YFThread.GetSize()-1,G_IOMRun.m_IsExitEvent,TRUE,1000)!=WAIT_OBJECT_0)  
  2.  
  3.  
  4.    for(i=0;i<G_IOMRun.YFThread.GetSize()-1;i++)  
  5.   {  
  6.    if(WaitForSingleObject(G_IOMRun.m_IsExitEvent[i],1000)!=WAIT_OBJECT_0)  
  7.    {  
  8.     lngWaitNum++;  
  9.    }  
  10.   }  

5、共享内存的创建

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

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