본문 바로가기
Study/C#(Window programming)

PCAN USB 데이터 가져와서 뿌리기 예제

by Answer Choi 2021. 10. 27.
반응형

앞서 PCAN USB 연결/해제 하기  에서 UI와 PCAN 연결/해제를 구현해 보았습니다.

 

우선 타이머를 설정합니다.

 

타이머는 널널하게 1ms로 설정하였습니다.

 

1ms마다 readmessage()를 실행하게 됩니다.

private void timer1_Tick(object sender, EventArgs e)
        {
            ReadMessage();
        }

readmessage에서는 can id를 검색해서 필요한 id만 가져오게 됩니다.

 

private void ReadMessage()
{
	TPCANMsg CANMsg;
    TPCANTimestamp CANTimeStamp;
    TPCANStatus stsResult;
    strMsg = new StringBuilder(256);             
    stsResult = PCANBasic.Read(m_PcanHandle, out CANMsg, out CANTimeStamp);
    if (stsResult != TPCANStatus.PCAN_ERROR_QRCVEMPTY) {   
    	uint id = CANMsg.ID;
        if(id!=0)                   
        	ProcessMessage(CANMsg, CANTimeStamp);
        } else {
        	PCANBasic.GetErrorText(stsResult, 0, strMsg);
            strMsg = new StringBuilder(256);
            statusText.Text = strMsg.ToString();
        }
}

pcan에서 데이터를 읽어 오류가 없으면 id를 읽고, 0이아니면 처리를 하게됩니다.

 

private void ProcessMessage(TPCANMsg theMsg, TPCANTimestamp itsTimeStamp)
{
    TPCANMsgFD newMsg;
    TPCANTimestampFD newTimestamp;

    newMsg = new TPCANMsgFD();
    newMsg.DATA = new byte[64];
    newMsg.ID = theMsg.ID;
    newMsg.DLC = theMsg.LEN;
    for (int i = 0; i < ((theMsg.LEN > 8) ? 8 : theMsg.LEN); i++)
		newMsg.DATA[i] = theMsg.DATA[i];
    newMsg.MSGTYPE = theMsg.MSGTYPE;
    newTimestamp = Convert.ToUInt64(itsTimeStamp.micros + 1000 * itsTimeStamp.millis + 0x100000000 * 1000 * itsTimeStamp.millis_overflow);
      
    if (newMsg.ID == 0x341) {//sbp_all_1
    	int soc = 0, soh = 0;
        soc = newMsg.DATA[0];
        soh = newMsg.DATA[1];
              
        subSoc.Text = soc.ToString();
        subSoh.Text = soh.ToString();
    }else if(newMsg.ID==0x3A2){//sbp_all_2
        double vol = 0;
        vol = newMsg.DATA[0] + (newMsg.DATA[1] << 8);
        string str = string.Format("{0:0.0}", ((double)vol / 10));
        subVoltage.Text = str;
    }else if (newMsg.ID == 0x540){
        int soc = 0, soh = 0;
        soc = newMsg.DATA[0];
        soh = newMsg.DATA[1];
               
        mainSoc1.Text = soc.ToString();
        mainSoh1.Text = soh.ToString();
	}else if (newMsg.ID == 0x541){
        double vol = 0;
        vol = newMsg.DATA[0] + (newMsg.DATA[1] << 8);
        string str = string.Format("{0:0.0}", ((double)vol / 10));
        mainVoltage1.Text = str;
    }else if (newMsg.ID == 0x543){
        int soc = 0, soh = 0;
        soc = newMsg.DATA[0];
        soh = newMsg.DATA[1];
                
        mainSoc2.Text = soc.ToString();
        mainSoh2.Text = soh.ToString();
    }else if (newMsg.ID == 0x544){
        double vol = 0;
        vol = newMsg.DATA[0] + (newMsg.DATA[1] << 8);               
        string str = string.Format("{0:0.0}", ((double)vol/10));                
        mainVoltage2.Text = str;
    }
}

processmessage에서는 가져온 pcan msg를 바탕으로 msg를 필터링 하게됩니다.

 

필터링을 할때는 ui를 통해 띄워주고자 하는 msg들을 띄워줍니다.

 

테스트를 위해 pcan explorer를 통해 임의의 msg를 만들어 보내줍니다.

 

프로그램을 통해 pcan에서 수집된 msg가 ui에 뿌려지는 걸 확인하실 수 있습니다.

 

이런식으로 필요한 데이터들을 손쉽게 보실 수 있습니다.

 

@@23-09-05 

신규로 프로그램을 다시 만들었습니다.

소스는 이곳에서 다운받으세요.

반응형

인기글