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

news/2024/7/6 0:59:51
 

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

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

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"));  ---------------------------------> 修改为szBuf.TrimLeft()
   } 
   szTemp.TrimLeft(TEXT("/t "));
   szTemp.TrimRight(TEXT("/t "));
   if (szTemp.GetAt(0) == TEXT('[') && 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"));
   if (nPos == -1)
   {
    szTemp = szBuf;
    szBuf.Empty();
   }
   else
   {
    szTemp = szBuf.Left(nPos);
    szBuf = szBuf.Right(szBuf.GetLength() - nPos);
   szBuf.TrimLeft(TEXT("/r/n"));  ---------------------------------> 修改为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
 {
  if(szMsg[i-1]==_T(':') || szMsg[i]==_T(','))
  {
        lngFlag=1;
  }
       
  if(lngFlag==1)
  {
     strConfig[j++]=szMsg[i];
  }
       
  if((j>0 && 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"),&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;
     }
     break;
     case 2:
     swscanf(strConfig,_T("%ld"),&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->BaudRate=BaudRate;
  dcb->Parity=(BYTE)Parity;
  dcb->ByteSize=(BYTE)ByteSize;
  dcb->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
    {
     if(WaitForSingleObject(G_IOMRun.m_IsExitEvent[i],1000)!=WAIT_OBJECT_0)
     {
      lngWaitNum++;
     }
    }

5、共享内存的创建

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

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





http://www.niftyadmin.cn/n/3655732.html

相关文章

.net精简框架集多个类同时串行化(XML方式)技术

存取类实例的参数最佳的方法当然是串行化技术,串行化支持两种方式:二进制方式,可以高保真的保存类示例,另一种是XML方式,它仅保存公共数据。很可惜.net 2.0的精简框架集仅支持XML方式。我这里做了一个示例,…

将一个数组旋转K步

题: 输入一个数组 [1,2,3,4,5,6,7] K3, 即旋转3步 输出 [5,6,7,1,2,3] 思路:1 把末尾的元素挨个pop , 然后unshift到数组前面 思路:2 把数组拆分,最后concat拼接到一起 /*** 把末尾的元素挨个pop , 然后unshift到数组前面* param arr* param k*/ export function kn1(arr:num…

判断一个字符串是否括号匹配

一个字符串s可能包括{}() [] 三种括号 判断s是否是括号匹配的 如(a{b}c)匹配, 而{a(b 或 {a(b}c}就不匹配 这个题考的就是 栈 栈: 先进后出 api: push pop length 栈和数组有什么区别? 没有区别 不是一个概念的东西, 逻辑结…

北京Tech.ed2006微软技术大会场记(9.21~9.23)

今年有幸获取了微软MVP在北京、上海、广州三地Tech.ed大会30张赠票中的一张,21号早6:50出发终于在10:30之前赶到了会场(北京九华山庄),三天两宿的时间虽然很累,但是收获很大。下边做了几张截图,简略的说一下…

两个栈 实现一个队列

请用两个栈,实现一个队列 队列: 概念:先进先出 api : add delete length 队列是逻辑结构,抽象模型 简单的,可以用数组、链表实现 复杂的队列服务,需要单独设计 // 思路 1 定义一个原型对象 里面包涵…

脚本引擎初步研究

由于组态软件里要嵌入脚本引擎,以前虽然在IOServer中嵌入了VBScript,但脚本引擎的概念实在是不甚明白,这几天集中突击了脚本引擎的相关知识,收获还不少。看了网上的一篇《实现一个脚本引擎》的文章,一步步做了下来&…

第十七届多国仪器展

上个礼拜有幸和同事一起参加了多国仪器展,用了尽一天的时间,逛了三个展厅。一个是仪器仪表类展厅,一个是系统自动化类展厅,此外还有水处理的展厅。我对仪器仪表不大感兴趣,对那些显示仪、泵、阀等等设备就觉得他们是一…