經過近一個月的努力,嵌入式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")); ---------------------------------> 修改為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"));
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;
}
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<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,如需轉載請自行聯系原作者