13.10.2 接收数据处理模块
串口接收到数据后,自定义串口类会向主窗体发送串口接收到数据的消息,并将接收的字符发送给主窗体。这个消息在自定义串口类中的定义如下:
- define WM_COMM_RXCHAR WM_USER+1
在主窗体类中为这个消息添加的处理函数原型如下:- LRESULT OnReceive(WPARAM ch, LPARAM port);
此外还需要为这个消息及消息的处理函数添加关联:- BEGIN_MESSAGE_MAP(CComElvesDlg, CDialog)
- ON_MESSAGE(WM_COMM_RXCHAR, OnReceive)
- END_MESSAGE_MAP()
在这个处理函数中需要根据当前的显示需求将接收到的数据显示到主窗体界面上,实现如下:- 01 LRESULT CComElvesDlg::OnReceive(WPARAM ch, LPARAM port)
- 02 {
- 03 if (port <= 0 || port > 4)
- 04 return -1;
- 05 m_RCount++; //接收的字节计数
- 06 CString strTemp;
- 07 strTemp.Format("%ld",m_RCount);
- 08 strTemp="RX:"+strTemp;
- 09 m_ctrlRCount.SetWindowText(strTemp); //显示接收计数
- 10 //判断是否显示接收到的数据
- 11 if(!m_bShow)
- 12 return -1;
- 13 if(m_CRData.GetLineCount()>400) //长度大于400行
- 14 {
- 15 m_rData.Empty(); //自动清空数据
- 16 m_rData="***The Length of the Text is too long, Emptied
- 17 Automaticly!!!***\r\n"; UpdateData(FALSE);
- 18 }
- 19 //根据进制进行显示
- 20 CString str;
- 21 if(m_bRHex)
- 22 { //十六进制
- 23 str.Format("%02X ",ch);
- 24 }
- 25 else
- 26 { //字符串
- 27 str.Format("%c",ch);
- 28 }
- 29 //将接收的字符加在字符串的最后
- 30 int nLen=m_CRData.GetWindowTextLength();
- 31 m_CRData.SetSel(nLen, nLen);
- 32 m_CRData.ReplaceSel(str);
- 33 nLen+=str.GetLength();
- 34 UpdateData(true);
- 35 SaveRMod();
- 36 return 0;
- 37 }
【代码解析】
第3行判断接收到的数据是否正确,如不正确则直接退出,否则在第5行将接收计数变量加1。第6~9行将当前计数变量的值显示到界面上。第11行判断当前是否显示接收到的数据,如果不显示则直接退出。在此需要注意,虽然没有显示接收到的数据,但是接收计数变量仍在更新。第13行判断当前显示的接收数据是否大于400行,如果大于400行则在第15~17行将接收到的数据清空,否则会影响程序的显示。第21行判断当前的显示格式是十进制还是十六进制,根据不同的进制将接收到的数据格式化为字符串。然后在第30~34行将这个由接收数据转化的字符串添加到当前所有已显示数据的后面,这步工作也是最费时间的。