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

简介:

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

 

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

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.     }  
  11.  

5、共享内存的创建

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

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

 

 

















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

相关文章
|
3天前
|
云安全 人工智能 自然语言处理
|
7天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
719 17
|
10天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
752 57
Meta SAM3开源:让图像分割,听懂你的话
|
8天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
329 116
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
497 37
|
23天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
2天前
|
Rust 安全
掌握Rust文件读取(从零开始的IO操作指南)
本教程手把手教你用Rust读取文件,涵盖`read_to_string`一次性读取和`BufReader`逐行高效读取,适合初学者掌握安全、高效的Rust文件操作,助你轻松入门系统编程。
150 113

热门文章

最新文章