我开发的远程监控系统分两个程序,一个服务器端程序,它运行在远程的服务器上,服务器通过一个485串口与远在5公里外的一个监测模块相连,这个模块可以监测电流电压等数据,模块有它的协议,实现实时监控,需要不停地向模块发送监测命令,模块接收到正确的命令就会返回电流电压值到串口。另一个客户端程序,需要通过网络与服务器程序通信,我设计的客户端程序是,在客户端设置一个时钟,周期地向服务器程序发送自定义命令,服务器程序收到命令后,向485端口发送监测模块的命令,模块返回电流电压值后,将返回的值经过处理,处理原理就是加头标志,和结束标志,处理过的数据发送到客户端程序,客户端程序收到数据再去掉头标志和结束标志显示出来。我的程序能运行正常,在实验室里(传输距离不远)也运行正常,但是程序在现场运行,3个小时后,程序就死了实时的电流电压值不变了,重新关闭,再运行又好了。第一次作类似的系统,请问问题会出在什么地方?

解决方案 »

  1.   

    我客户端程序接收到服务器端程序发来的处理过的电流电压值之后,按下面代码转换
             i=0;
    switch (m_strEditRecvData.GetAt(i))//m_strEditRecvData保存了接收到的数据
    {
    case 'V'://V为电压数据的头
    {
    m_strV ="";
    for(j=1;j<length;j++)
    {
    if('Z'!=m_strEditRecvData.GetAt(j))
    {//Z是数据的结束标志
    m_strV +=m_strEditRecvData.GetAt(j);
    }
    else
    {
    UpdateData(FALSE);
    break;
    }
    }
    m_WorkstrV = m_strV;
    break;
    }
    case 'A'://A为电流数据的头标志
    {
    m_strA ="";
    for(k=1;k<length;k++)
    {
    if('Z'!=m_strEditRecvData.GetAt(k))
    {//Z是数据的结束标志
    m_strA +=m_strEditRecvData.GetAt(k);
    }
    else
    {
    UpdateData(FALSE);
    break;
    }
    }
    m_WorkstrA = m_strA;
    break;
    }
    case 'H':
    {
    m_strHZ ="";
    for(m=1;m<length;m++)
             { 
    if('Z'!=m_strEditRecvData.GetAt(m))
    {
    m_strHZ +=m_strEditRecvData.GetAt(m);
    }
    else
    {
    UpdateData(FALSE);
    break;
    }
    }
    m_WorkstrHZ = m_strHZ;
    break;
    }
    default:
    break;
    }
      

  2.   

    你的switch语句是否有问题
    switch (m_strEditRecvData.GetAt(i))//m_strEditRecvData保存了接收到的数据
    {
    case 'V'://V为电压数据的头
    {

    break;
    }
    case 'A'://A为电流数据的头标志
    {

    break;
    }
    case 'H':
    {

    break;
    }
    }
    m_WorkstrHZ = m_strHZ;
    break;
    }
    default:
    break;
    }
    --------
    这样的话,对于因意外,数据有丢失情况下
    起始字符不是 V、A、H的情况,似乎没有做相应处理,会不会导致不断死循环在这个switch上?
      

  3.   

    default:
    break;
    应该就不会死循环吧。