头文件中:
1,定义缓冲区数组。。
//char *Device_pCirBuf;//环形缓冲区 BYTE Device_pCirBuf[81];//环形缓冲区
cpp文件中
2,定义缓冲区接收长度,接收正确数据包定义,读指针(缓冲区头),写指针(缓冲区尾)
char Device_rightdata[38];//保存数据包int Device_size=81;//缓冲区长度int Device_startPos,Device_endPos;
3,打开串口的时候,缓冲区指针清零。
if(!m_ctrlComm.GetPortOpen()) { m_ctrlComm.SetPortOpen(TRUE); //打开串口。 GetDlgItem(IDC_OPEN_SERIS)->SetWindowText("请关闭串口"); m_ctrlIconOpenoff.SetIcon(m_hIconOpen); //Device_pCirBuf = new char [Device_size]; //memset(Device_pCirBuf, 0, Device_size); Device_startPos=0,Device_endPos=0; }
4,串口接收1个字节就触发接收事件。
m_ctrlComm.SetRThreshold(1); //每当缓冲区有多余或等于1个字符(字节)时引发一个接收的OnComm事件
5,接收触发事件
void CDevicedlg::OnOnCommMscomm1() { // TODO: Add your control notification handler code here //UpdateData(TRUE); VARIANT variant_inp; COleSafeArray safearray_inp; LONG Device_len,Device_k; // 接收区 int slen=0,r_d_len=38; BYTE recvdata[512];//定义存放二进制数据的数组 CString str; if(m_ctrlComm.GetCommEvent() == 2) // 表示接收缓冲区内有字符 { // m_ctrlIconOpenoff.SetIcon(m_hIconOpen); variant_inp=m_ctrlComm.GetInput(); // /读串口输入缓冲区 //将VARAIANT变量赋值给COleSafeArray类的实例 safearray_inp=variant_inp; //使用COleSafeArray类的成员函数获取数据长度 Device_len=safearray_inp.GetOneDimSize(); //使用COleSafeArray类的成员函数将数据写入数组 for(Device_k=0;Device_kDevice_startPos ? Device_endPos-Device_startPos : 80-Device_startPos+1+Device_endPos)>r_d_len-1) { //找到帧头。one: if (Device_pCirBuf[Device_startPos]==(BYTE)0xA5 && Device_pCirBuf[Device_startPos+1>80 ? 0 : Device_startPos+1]==(BYTE)0xA9) { //帧头对,则从帧头位置取38个字节的完整帧。 for (int i=0; i
6,正确数据包处理
DataProcessingvoid CDevicedlg::DataProcessing(){ BYTE rebuff; int k, R_D_LEN=38; CString str; bool judge; BYTE judge_sum; switch((BYTE)Device_rightdata[5]) { case 2:// { rebuff=0; //rebuff=*(char *)(recvdata+2); for(k=2;k
7,关闭串口的时候,指针清零。
if(m_ctrlComm.GetPortOpen()) { m_ctrlComm.SetPortOpen(FALSE); GetDlgItem(IDC_OPEN_SERIS)->SetWindowText("请打开串口"); m_ctrlIconOpenoff.SetIcon(m_hIconOff); //delete []Device_pCirBuf;//删除数组pCirBuf指针对象, //Device_pCirBuf = NULL;//初始化为 空指针, Device_startPos=0; Device_endPos=0; return; }
8,退出按钮,设置缓冲区指针清零。
void CDevicedlg::OnClose() { // TODO: Add your control notification handler code here //MessageBox(TEXT("是否确认删除?"),TEXT("Warning!!"),4); //AfxMessageBox("确定退出吗?","设备管理",MB_OKCANCEL) int ret=AfxMessageBox("确定退出吗?",MB_OKCANCEL); if(IDOK==ret) { //清除数据,避免bug。 m_k6=0; m_k5=0; m_k4=0; m_k3=0; m_k2=0; m_k1=0; UpdateData(false); if(m_ctrlComm.GetPortOpen()) { // CByteArray m_Array; // m_Array.RemoveAll(); // m_Array.SetSize(8); // m_Array.SetAt(0,0xA5); // m_Array.SetAt(1,0xA6); // m_Array.SetAt(2,0x08); // m_Array.SetAt(3,0xF5); //钳子 // m_Array.SetAt(4,0xF6); //线型 // m_Array.SetAt(5,0x0A); // m_Array.SetAt(6,0x01); // m_Array.SetAt(7,0xAD); // m_ctrlComm.SetOutput(COleVariant(m_Array)); m_ctrlComm.SetPortOpen(FALSE); if (Device_pCirBuf) { //delete []Device_pCirBuf;//删除数组pCirBuf指针对象 //Device_pCirBuf = NULL;//初始化为空指针 Device_startPos=0; Device_endPos=0; } } CDialog::OnOK(); } else if(IDCANCEL==ret) { return; }}
退出该对话框:
//退出软件void CMyDlg::OnOK() { // TODO: Add extra validation here //停止定时 KillTimer(1); //关闭串口 if(m_ctrlComm.GetPortOpen()) { m_ctrlComm.SetPortOpen(FALSE); //缓冲区指针清零 if (Device_pCirBuf)//可以吗,内存还有吗 { Device_startPos=0; Device_endPos=0; } } CDialog::OnOK();}
void CDevicedlg::OnClose()
{
// TODO: Add your control notification handler code here
//MessageBox(TEXT("是否确认删除?"),TEXT("Warning!!"),4);
//AfxMessageBox("确定退出吗?","设备管理",MB_OKCANCEL)
int ret=AfxMessageBox("确定退出吗?",MB_OKCANCEL);
if(IDOK==ret)
{
//清除数据,避免bug。
m_k6=0;
m_k5=0;
m_k4=0;
m_k3=0;
m_k2=0;
m_k1=0;
UpdateData(false);
if(m_ctrlComm.GetPortOpen())
{
// CByteArray m_Array;
// m_Array.RemoveAll();
// m_Array.SetSize(8);
// m_Array.SetAt(0,0xA5);
// m_Array.SetAt(1,0xA6);
// m_Array.SetAt(2,0x08);
// m_Array.SetAt(3,0xF5); //钳子
// m_Array.SetAt(4,0xF6); //线型
// m_Array.SetAt(5,0x0A);
// m_Array.SetAt(6,0x01);
// m_Array.SetAt(7,0xAD);
// m_ctrlComm.SetOutput(COleVariant(m_Array));
m_ctrlComm.SetPortOpen(FALSE);
if (Device_pCirBuf)
{
//delete []Device_pCirBuf;//删除数组pCirBuf指针对象
//Device_pCirBuf = NULL;//初始化为空指针
Device_startPos=0;
Device_endPos=0;
}
}
CDialog::OnOK();
}
else if(IDCANCEL==ret)
{
return;
}
}