嵌入式IOEServer终于开发完成,相应的问题作一个系统阐述(WINCE)
2007-10-27 11:16
639 查看
2006年10月24日 13:30:00
经过近一个月的努力,嵌入式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>wcslen(szMsg);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-G_IOMRun.YFThread.GetSize()-1;i++)
{
if(WaitForSingleObject(G_IOMRun.m_IsExitEvent[i],1000)!=WAIT_OBJECT_0)
{
lngWaitNum++;
}
}
5、共享内存的创建
在对话框窗体的OnInitDialog事件中,不能创建共享内存(我是指在这里动态调用的DLL,DLL初始化中有创建共享内存的代码),只好定义了一个一毫秒的时钟,解决了该问题(不知道为什么在另一款WinCE操作系统上又出了问题)
先写这些,还有写问题,以后在一一写来(以上问题只是我个人经验,如有不对之处希望高手指点)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1348840
经过近一个月的努力,嵌入式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>wcslen(szMsg);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-G_IOMRun.YFThread.GetSize()-1;i++)
{
if(WaitForSingleObject(G_IOMRun.m_IsExitEvent[i],1000)!=WAIT_OBJECT_0)
{
lngWaitNum++;
}
}
5、共享内存的创建
在对话框窗体的OnInitDialog事件中,不能创建共享内存(我是指在这里动态调用的DLL,DLL初始化中有创建共享内存的代码),只好定义了一个一毫秒的时钟,解决了该问题(不知道为什么在另一款WinCE操作系统上又出了问题)
先写这些,还有写问题,以后在一一写来(以上问题只是我个人经验,如有不对之处希望高手指点)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1348840
相关文章推荐
- 嵌入式IOEServer终于开发完成,相应的问题作一个系统阐述(WINCE)
- 嵌入式IOEServer终于开发完成,相应的问题作一个系统阐述(WINCE)
- 嵌入式IOEServer终于开发完成,相应的问题作一个系统阐述(WINCE)
- 嵌入式IOEServer终于开发完成,相应的问题作一个系统阐述(WINCE)
- 关于 "ARM嵌入式系统开发--软件设计与优化" 这本书中的一个问题
- 问题阐述: 本人使用mini6410开发了一个sqlite数据库的程序,在mini6410的linux系统下已经能够成功运行了。因为Android使用的也是linux内核,所以我想当然的认为按照同样
- Problems in Embedded System Development(嵌入式系统开发常见问题)
- 开发一套系统的目的不是要来『让程式设计师写程式』,开发一套系统的目的是要来『解决一个问题』(转)
- 介绍一个免费部分开源项目:基于ARM的嵌入式系统开发平台-CooCox
- 关于.net 开发web遇到的一个奇葩问题 drowdown未放置在runat="server"标记里
- 开发的系统终于测试完成
- 如何组建和管理一个嵌入式系统软件开发团队
- 摘要 MAC,PIN,磁道密钥 在平时的工作中,很少接触安全这块内容,最近需要自己独立完成安全这块内容,在开发中遇到的问题会在下面的理解中得到相应的解决。 在交易平台中,基于安全考
- 利用 Linux Lab 完成嵌入式系统软件开发全过程
- (转载)巧借WinCE BSP移植,嵌入式系统开发有捷径
- 一个文员级的报表工具Wreport终于开发完成,用word设计报表,最终把程序员完全从报表中解放出来
- 互联网项目开发效率与系统性能的一个取舍问题
- 【嵌入式Linux学习七步曲之第二篇 ARM+Linux开发环境】详解gdb+gdbserver运行问题./gdbserver: error in loading shared libraries
- 请教一个问题,Android应用运行时在调用某个API(比如相机)时,系统如何判断这个应用是否具备相应的权限?
- Mac系统开发常见问题-Mac登录界面多了一个其他账户选项