往串口写控制命令,被控制的硬件都做动作了;而我这儿屏幕上显示的还是上一个控制命令的回应,随后过了一会儿才出现这次命令的回应,而且随后的测试的回应变得越来越慢(而硬件动作也没有延迟),可能是哪方面的原因?!
程序开始运行的时候没那么慢,做了一些测试以后才出现上述现象。
程序开始运行的时候没那么慢,做了一些测试以后才出现上述现象。
解决方案 »
- 如何修改listCtrl的背景。
- 关于孙鑫的MFC视频
- 请问有快速的将多张BMP转成多页TIFF的方法吗?
- 那里有基于机器码的注册模块下载?
- Windows下的程序中用Ftp访问Unix下Ftp服务器上的文件,出现未知错误
- I动态数组的问题
- 关于WIN2003安全机制,在每次进行远程计算机共享资源访问时候,都得先进行远程IPC会话,是这样的吗?
- Visual Studio6.0安装不上,求救!
- 有关编辑框的问题?
- 请教一个关于VB下调用VC里的DLL的问题
- 编译时出现以下link错误,怎么办?(在线等待,50请进)
- 请教高人?何谓组播?,还有什么c_root\c_leaf d_root\d_root
建议在上一个命令未返回前不要发下一个测试命令!
{
DWORD readnum=Communication();
if(readnum==0)
{
iLinkCount++;
if(iLinkCount==50)
{
KillTimer(timeID);
UINT ooo=this->MessageBox("RS232 ERROR","´íÎó",MB_RETRYCANCEL|MB_ICONSTOP);
if(ooo==IDRETRY)
timeID=SetTimer(3,100,NULL);
iLinkCount=0;
}
return;
} iLinkCount=0;
byte mCheck=0;
for(int i=0;i<=m_Count;i++)
{
mCheck+=inbuff[i];
}
if(mCheck!=0xFF)
return;
m_Count=inbuff[0];
UpdateWindow();
switch(m_Count)
{
case 0x01: LinkResult();break;
case 0x2e: LPUCheck();break;
case 0x3e: LPUCheck();break;
case 0xE1: wait();break;
case 0x13: {SelfCheck();break;
case 0x46: MFDWrongCheck();break;
case 0x52: RoundKey();break;
case 0x61: VideoFold();break;
case 0x71: MFDFixCheck();break;
case 0xf2: Wrong();break;
default: return;
}
CFrameWnd::OnTimer(nIDEvent);
}
int CMainFrame::Communication()
{
for(int i=0;i<15;i++)
inbuff[i]=0; DWORD nBytesRead,nBytesWrite;
p_outbuff=&outbuff[0];
if(!WriteFile(handle,p_outbuff,3,&nBytesWrite,NULL))
{
nBytesWrite=0;
return 0;
}
if(nBytesWrite!=3)
return 0;
p_inbuff=&inbuff[0];
if(!ReadFile(handle,p_inbuff,1,&nBytesRead,NULL))
{
nBytesRead=0;
return 0;
}
if(nBytesRead==0)
return 0;
m_Count=inbuff[0];
m_Count&=0x0F;
p_inbuff++;
if(!m_Count)
return true; if(!ReadFile(handle,p_inbuff,m_Count,&nBytesRead,NULL))
{
nBytesRead=0;
return 0;
}
if(nBytesRead!=m_Count)
{
return 0;
} //PurgeComm(handle,PURGE_RXCLEAR);
return true;
}
outbuffer[0]=A0;
outbuffer[0]=00;
outbuffer[0]=E4;
其他命令也是类似结构!
CXinxiDlg xinxi;
if(xinxin.DoModal==1)
{
outbuffer[0]=A0;
outbuffer[0]=00;
outbuffer[0]=E4;}
对话框用于输入一些测试信息,以前没加的时候不会变慢;加了以后就出现上述回送显示延迟的现象。
还有,我曾加过一个用于退出的按钮,即往串口发通信联络命令;然后在每进行完一项测试项目后我按这个按钮,然后再进入其他测试项目,发现速度也不会出现明显变慢(至少察觉不出来);我就奇怪了,一样的命令格式,我先进入通信状态再进入其他测试项目跟直接进入有什么区别?!不都是要覆盖outbuffer[]吗?
* 函数介绍:规约处理函数
* 输入参数:无
* 输出参数:无
* 返回值 :TRUE-〉成功,FALSE-〉失败
*/BOOL CModbusEPM420::ProtocolProc()
{
unsigned char TXBuf[BUFSZ];
const int DELAYTIME = 100;
unsigned short nCrc;
unsigned int i,nDataCount; TXBuf[0] = m_nSlaveID;
TXBuf[1] = 0x03;
TXBuf[2] = 0x00;
TXBuf[3] = 0x00;
TXBuf[4] = 0x00;
TXBuf[5] = 0x10;
nCrc = MB_Crc(TXBuf,6);
TXBuf[6] = nCrc & 0xff;
TXBuf[7] = (nCrc >> 8) & 0xff; m_pTermSrvPort->TX (TXBuf,8);
Sleep(DELAYTIME);
m_pTermSrvPort->RX (); nDataCount = TXBuf[4]*256+TXBuf[5];
if (m_pTermSrvPort->m_nRXCount == (int)(nDataCount*2+5) )
{
nCrc = MB_Crc(m_pTermSrvPort->m_szRXBuf,nDataCount*2+3);
if (m_pTermSrvPort->m_szRXBuf[nDataCount*2+3] == (nCrc & 0xff) &&
m_pTermSrvPort->m_szRXBuf[nDataCount*2+4] == ((nCrc >> 8) & 0xff) )
{
//TRACE("update EPM420 m_fAI[0] - m_fAI[15]\n");
for (i=0;i<nDataCount;i++) //0-15
{
ASSERT (i < RTU_AI_MAX && i < m_nAICount);
m_fAI[i] = (float)(m_pTermSrvPort->m_szRXBuf[3+2*i]*256 + m_pTermSrvPort->m_szRXBuf[4+2*i]);
}
}
else
{
TRACE("EPM420 Crc error\n");
}
} TXBuf[0] = m_nSlaveID;
TXBuf[1] = 0x03;
TXBuf[2] = 0x00;
TXBuf[3] = 0x40;
TXBuf[4] = 0x00;
TXBuf[5] = 0x08;
nCrc = MB_Crc(TXBuf,6);
TXBuf[6] = nCrc & 0xff;
TXBuf[7] = (nCrc >> 8) & 0xff; m_pTermSrvPort->TX (TXBuf,8);
Sleep(DELAYTIME);
m_pTermSrvPort->RX (); nDataCount = TXBuf[4]*256+TXBuf[5];
if (m_pTermSrvPort->m_nRXCount == (int)(nDataCount*2+5) )
{
nCrc = MB_Crc(m_pTermSrvPort->m_szRXBuf,nDataCount*2+3);
if (m_pTermSrvPort->m_szRXBuf[nDataCount*2+3] == (nCrc & 0xff) &&
m_pTermSrvPort->m_szRXBuf[nDataCount*2+4] == ((nCrc >> 8) & 0xff) )
{
//TRACE("update EPM420 m_fAI[16] - m_fAI[19]\n");
for (i=0;i<nDataCount/2;i++) //16-19
{
ASSERT (i+16 < RTU_AI_MAX && i+16 < m_nAICount);
m_fAI[i+16] = (float)(
m_pTermSrvPort->m_szRXBuf[3+4*i]*256 +
m_pTermSrvPort->m_szRXBuf[4+4*i] +
m_pTermSrvPort->m_szRXBuf[5+4*i]*256*256*256 +
m_pTermSrvPort->m_szRXBuf[5+4*i]*256*256
);
}
}
else
{
TRACE("EPM420 Crc error\n");
}
}
TXBuf[0] = m_nSlaveID;
TXBuf[1] = 0x03;
TXBuf[2] = 0x02;
TXBuf[3] = 0x80;
TXBuf[4] = 0x00;
TXBuf[5] = 0x11;
nCrc = MB_Crc(TXBuf,6);
TXBuf[6] = nCrc & 0xff;
TXBuf[7] = (nCrc >> 8) & 0xff; m_pTermSrvPort->TX (TXBuf,8);
Sleep(DELAYTIME);
m_pTermSrvPort->RX ();
nDataCount = TXBuf[4]*256+TXBuf[5];
if (m_pTermSrvPort->m_nRXCount == (int)(nDataCount*2+5) )
{
nCrc = MB_Crc(m_pTermSrvPort->m_szRXBuf,nDataCount*2+3);
if (m_pTermSrvPort->m_szRXBuf[nDataCount*2+3] == (nCrc & 0xff) &&
m_pTermSrvPort->m_szRXBuf[nDataCount*2+4] == ((nCrc >> 8) & 0xff) )
{
//TRACE("EPM420 update m_fAI[20] - m_fAI[36]\n");
for (i=0;i<nDataCount;i++) //20-36
{
ASSERT (i+20 < RTU_AI_MAX && i+20 < m_nAICount);
m_fAI[i+20] = (float)(m_pTermSrvPort->m_szRXBuf[3+2*i]*256 + m_pTermSrvPort->m_szRXBuf[4+2*i]);
}
}
else
{
TRACE("EPM420 Crc error\n");
}
} TRACE ("RTU m_szName = %10s,m_nRTUID = %d, m_szProtocol=%15s, ChannelName = %10s\n",
m_szName,m_nRTUID,m_szProtocol,m_pTermSrvPort->m_szName );
return TRUE;
}
你作的是电力系统相关的监控吧
显示变慢的问题!!!程序主框架采用的是视图/文档结构。我对话框是用DoModal()显示的,应该没什么
问题吧。如下所示(其中一项测试的窗体):
void CMainFrame::OnSimage()
{
CSimage m_image;
m_image.DoModal();
}
}
我主要是不在现场,不然也许可以帮你忙,
给你个多线程的简单例子,
//#include "StdAfx.h"
#include "Testdes.h" //上面二个是和其他CPP文件相同的几个必要的头文件,在这里我的工整叫Testdes
#include "CommCtrl.h" //不用说了吧
#include "TestdesDlg.h" //对话框头文件UINT SetData(LPVOID pParam)
{
CTestdesDlg *dlg1 = (CTestdesDlg*)pParam;
CString str;
str.Format("你的数据");
dlg1->SetDlgItemText(IDC_EDIT3,str); //在对话框中的IDC_EDIT3显示"你的数据" return 1;
}//"CommCtrl.h"
//函数声明
UINT SetData(LPVOID pParam);
你最好找个近点的高手,我得走了,实在不好意思了。