LRESULT CAdcDacDlg::OnSerialLinkEvent(WPARAM WParam, LPARAM LParam) { int MsgType=HIWORD(LParam); BYTE Cmd=(BYTE)LOWORD(LParam); int AdcVal, Channel; CStatic* pStaticAdc[]={&m_StaticAdc0,&m_StaticAdc1,&m_StaticAdc2,&m_StaticAdc3}; CStatic* pStaticAverAdc[]={&m_StaticAverAdc0,&m_StaticAverAdc1,&m_StaticAverAdc2,&m_StaticAverAdc3}; CStatic* pStaticDac[]={&m_StaticDac0,&m_StaticDac1}; static int NSample[4]={0,0,0,0},NAverage[4]={0,0,0,0}, SumSample[4]={0,0,0,0}, SumAverage[4]={0,0,0,0}; static double DNSample[4]={0,0,0,0}, DNAverage[4]={0,0,0,0}; if(MsgType==SERIAL_SYNC_MSG) { if(Cmd==CMD_GET_EXT_ADC || Cmd==CMD_GET_AVERAGED_ADC) { ComMsg msg=theApp.m_SerialLink.m_Pool.GetMsg(WParam); AdcVal=BytesToShort(msg.Buf[2],msg.Buf[3]); Channel=msg.Buf[1]; if((Channel<0)||(Channel>3)) return (LRESULT)0; char ch[30]; double delta, sigma; if(Cmd==CMD_GET_EXT_ADC) { NSample[Channel]++; SumSample[Channel]+=AdcVal; delta=AdcVal-SumSample[Channel]/(double)NSample[Channel]; DNSample[Channel]+=delta*delta; sigma=sqrt(DNSample[Channel]/NSample[Channel]); } else { NAverage[Channel]++; SumAverage[Channel]+=AdcVal; delta=AdcVal-SumAverage[Channel]/(double)NAverage[Channel]; DNAverage[Channel]+=delta*delta; sigma=sqrt(DNAverage[Channel]/NAverage[Channel]); } double U,I; switch(Channel) { case 1: I=BytesToShort(msg.Buf[2],msg.Buf[3])*(4.096/16384.)*(25./2.5); //В Амперах sprintf(ch,"%4d, %2.1fA",AdcVal,I); break; case 2: U=BytesToShort(msg.Buf[2],msg.Buf[3])*(4.096/16384.)*(25./2.5); //В Вольтах sprintf(ch,"%4d, %2.1fВ",AdcVal,U); break; default: sprintf(ch,"%4d",AdcVal); } if(Cmd==CMD_GET_EXT_ADC) pStaticAdc[Channel]->SetWindowText(ch); else pStaticAverAdc[Channel]->SetWindowText(ch); } else if(Cmd==CMD_GET_ADC_TC_I_U_TREF) { ComMsg msg=theApp.m_SerialLink.m_Pool.GetMsg(WParam); double I, U; int Adc0, Adc1, Adc2; char ch[30]; Adc0=BytesToShort(msg.Buf[1],msg.Buf[2]); // Напряжение с термопары Adc1=BytesToShort(msg.Buf[3],msg.Buf[4]); // Ток нагревателя Adc2=BytesToShort(msg.Buf[5],msg.Buf[6]); // Напряжение на нагревателе I=Adc1*(4.096/16384.)*(25./2.5); //В Амперах U=Adc2*(4.096/16384.)*(25./2.5); //В Вольтах sprintf(ch,"%4d",Adc0); pStaticAverAdc[0]->SetWindowText(ch); sprintf(ch,"%4d, %2.1fA",Adc1,I); pStaticAverAdc[1]->SetWindowText(ch); sprintf(ch,"%4d, %2.1fV",Adc2,U); pStaticAverAdc[2]->SetWindowText(ch); } else if(Cmd==CMD_GET_DAC_VAL) { ComMsg msg=theApp.m_SerialLink.m_Pool.GetMsg(WParam); Channel=msg.Buf[1]; if((Channel<0)||(Channel>1)) return (LRESULT)0; char ch[30]; AdcVal=BytesToShort(msg.Buf[2],msg.Buf[3]); sprintf(ch,"%4d, %2.2fV",AdcVal,AdcVal*(5./16384.)); pStaticDac[Channel]->SetWindowText(ch); } } else if(MsgType==SERIAL_ERROR_COM_FAILED || MsgType==SERIAL_ERROR_TIMEOUT || MsgType==SERIAL_ASYNC_MSG) { for(Channel=0;Channel<4;Channel++) { pStaticAdc[Channel]->SetWindowText("..."); pStaticAverAdc[Channel]->SetWindowText("..."); if(Channel<sizeof(pStaticDac)/sizeof(void*)) pStaticDac[Channel]->SetWindowText("..."); } } return (LRESULT)0; }
unsigned short PacketReader::readShort() { return BytesToShort(readChar(), readChar()); }