📄 a808mdlg.cpp
字号:
if(str=="停止发送")
{
SetTimer(1,200,NULL); //启动定时器,发送数据
SendData(); //发送数据
}
}
}
//显示处理:数据从仪表返回后进行的显示处理
void CA808MDlg::DisplayParameter()
{
CListBox* plist=(CListBox*)GetDlgItem(IDC_LIST_PARAMETER);
int len=m_pRxdatd.GetSize(); //收到数据的长度
CString str;
CString strtemp1,strtemp2,strtemp3;
char temp;
CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT_DISPLY_PARAMETER);
CClientDC dc(this);
CEdit* pEdit1=(CEdit*)GetDlgItem(IDC_EDIT_FOR_WRITE);
CFont* pOldFont = (CFont*) (dc.SelectObject(&font));
for(int i=0;i<len;i++)
{
temp=m_pRxdatd.GetAt(i);
str+=temp;
}
strtemp3=m_pRxdatd.GetAt(3);
if(str.Find("N*")!=-1) //控制器不按指令动作
{
str="没有修改";
}
if(str.Find("I*")!=-1) //这是三类执行数据修改的指令,正常请继续
{
m_rxstate=WRITE_FOUR_COMMAND;
m_shortProcess=true;
// up_down=100; //这是自己定的一个状态。
// pEdit1->SetWindowText("come on");
}
if(str.Find("]20")!=-1) //扫描表指令
{
strtemp1=str.Mid(6,5);
strTostr(strtemp1);
pEdit->SetWindowText(strtemp1); //在主显示位置显示数据
strtemp2=str.Mid(11,5);
strTostr(strtemp2);
pEdit1->SetWindowText(strtemp2);
str=strtemp1+':'+strtemp2;
}
if(str.Find("<??>0A*")!=-1) //新参数超过控制器的允许范围
{
str="超上限!";
}
else if(str.Find("<??>5A*")!=-1) //新参数超过控制器的允许范围
{
str="超下限!";
}
else if(str.Find("A*")!=-1) //发收一切正常
{
int x=str.Find("A*");
str=str.Mid(4,x-4);
strTostr(str); //转换字符为标准显示
}
if(!m_shortProcess)
{
switch(m_rxstate)
{
case WRITE_FOUR_COMMAND:
case WRITE_PARAMETER: //在单参数位置显示写参数:成功与否
pEdit1->SetWindowText(str); //在单参数位置显示一个参数值,以供写参数时参考
up_down=0;
break;
case SINGLE_PARAMETER:
pEdit1->SetWindowText(str); //在单参数位置显示一个参数值,以供写参数时参考
break;
case LIST_PARAMETER:
strtemp3=GetParamterFromCommand(strtemp3);
strtemp3+="=";
str=strtemp3+str;
plist->AddString(str); //在列表中显示数据
break;
default:
pEdit->SetFont(&font,TRUE);
pEdit->SetWindowText(str); //在主显示位置显示数据
break;
}
}
dc.SelectObject(pOldFont);
UpdateData(FALSE);
}
void CA808MDlg::OnTimer(UINT nIDEvent)
{
CEdit* pedit=(CEdit*)GetDlgItem(IDC_EDIT_DISPLY_PARAMETER);
CString num;
int number;
pedit->GetWindowText(num);
number=atoi((const char*)num);
if(number<1)
number=1;
double dt = ::timeGetTime()/1000.0;
CButton* pcheck=(CButton*)GetDlgItem(IDC_CHECK_CHARACT);
//处理不能正常接收的数据
CListBox* plist=(CListBox*)GetDlgItem(IDC_LIST_ERROR);
CString str,str1;
switch(nIDEvent)
{
case 0:
m_scope.AddValue(dt,number);
m_scope.SetValue(number);
m_scope.UpdateCurve();
//m_ctrlHistogram.SetPos(number);
break;
case 1:
if(m_pRxdatd.GetSize())
{
for(int i=0;i<m_pRxdatd.GetSize();i++)
{
if(pcheck->GetCheck())
{
str1.Format("%c",m_pRxdatd.GetAt(i)); //显示字符
}
else
{
str1.Format("%02x ",m_pRxdatd.GetAt(i)); //显示十六进制并加一空格
}
str+=str1;
}
plist->AddString(str); //在错误列表中显示不能处理的数据
}
if(m_rxstate!=LIST_PARAMETER && !m_shortProcess)
m_rxstate=MAIN_NUMBER; //只要不是参数列时,恢复主通信状态
m_pRxdatd.RemoveAll(); //时间到删除数据,并发送下一轮数据
m_shortProcess=false;
SendData();
Beep(3000,30); //有error时发出提示音
break;
}
CDialog::OnTimer(nIDEvent);
}
//组织要发送的数据,
void CA808MDlg::SendData()
{
CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT_FOR_WRITE1);
CButton* pButton=(CButton*)GetDlgItem(IDC_BUTTON_READ_PARAMETER);
static n_parameter=0;
CByteArray hexdata;
CString strTemp="L";
//取表号
CComboBox* pcombo=(CComboBox*)GetDlgItem(IDC_COMBO_METER_INDEX);
int meterIndex=1+pcombo->GetCurSel();
CString str;
int index;
str.Format("%02d",meterIndex); //表号
strTemp+=str; //L{N}
//取参数代码
pcombo=(CComboBox*)GetDlgItem(IDC_COMBO_PARAMETER);
CString str1;
CString str2;
CString temp;
switch(m_rxstate)
{
case WRITE_PARAMETER:
index=pcombo->GetCurSel();
pcombo->GetLBText(index,str1);
if(up_down==1) //按升
str2='+';
else if(up_down==-1) //按降
str2='-';
else //按写按钮
{
pEdit->GetWindowText(temp); //取得要写的字符
strToData(temp); //对照表的格式转换成发送的数据格式
str.Format("%05s",temp); //格式化成长度5
str2='#';
str2+=str; //这是最终写参数:要是参数可以接受,则进行到下一步:第四类指令
}
break;
case WRITE_FOUR_COMMAND: //对上面的参数写的继续,修改参数确定
index=pcombo->GetCurSel();
pcombo->GetLBText(index,str1);
str2='I';
break;
case SINGLE_PARAMETER:
index=pcombo->GetCurSel();
pcombo->GetLBText(index,str1);
str2='?';
break;
case LIST_PARAMETER: //如果正在读参数
pcombo->GetLBText(n_parameter+1,str1); //读取参数字符
str2='?';
n_parameter++; //计数递加
if(n_parameter==m_ParameterNumber-1) //读完所有参数
{
n_parameter=0; //静态计数归0
m_rxstate=MAIN_NUMBER; //复位正在读参数标志
pButton->SetWindowText("读参数"); //显示已完成读参数过程
}
break;
default:
str1='M';
str2='?';
break;
}
strTemp+=str1.Left(1); //L{N}{P}
strTemp+=str2; //L{N}{P}{C}
strTemp+='*'; //L{N}{P}{C}*组成二类指令
for(int i=0;i<strTemp.GetLength();i++)
hexdata.Add(strTemp.GetAt(i));
DispCodeforSend(hexdata); //显示发送的十六进制
if(m_ctrlComm.GetPortOpen()) //如果没有打开串口时,防止出错
m_ctrlComm.SetOutput(COleVariant(hexdata));
}
//读取参数表
void CA808MDlg::OnButtonReadParameter()
{
CComboBox* pcombo=(CComboBox*)GetDlgItem(IDC_COMBO_PARAMETER); //参数表列表控件
m_ParameterNumber=pcombo->GetCount(); //取得参数行数
CButton* pButton=(CButton*)GetDlgItem(IDC_BUTTON_READ_PARAMETER); //本按钮控件
m_rxstate=LIST_PARAMETER;
pButton->SetWindowText("正在读参数...."); //本按钮并显示提示
CListBox* plist=(CListBox*)GetDlgItem(IDC_LIST_PARAMETER); //显示参数列表
int n=plist->GetCount();
if(n>0)
{
for(int i=n-1;i>=0;i--)
{
plist->DeleteString(i); //在读取参数前清除原有的内容
}
}
m_shortProcess=true;
}
//写参数按钮动作
void CA808MDlg::OnButtonWriteParameter()
{
m_rxstate=WRITE_PARAMETER;
m_shortProcess=true;
}
//参数列表选择参数时,读取其一个参数,以便进行写此参数操作
void CA808MDlg::OnSelchangeComboParameter()
{
m_rxstate=SINGLE_PARAMETER;
m_shortProcess=true;
}
//显示发送的数据代码
void CA808MDlg::DispCodeforSend(CByteArray &hexdata)
{
CButton* pcheck=(CButton*)GetDlgItem(IDC_CHECK_CHARACT);
if(m_rxstate==SINGLE_PARAMETER|| m_rxstate==WRITE_PARAMETER && !m_shortProcess)
{
CEdit* p=(CEdit*)GetDlgItem(IDC_EDIT_ADD_VERIFY);
CString strp;
CString strtemp;
for(int i=0;i<hexdata.GetSize();i++)
{
if(pcheck->GetCheck())
{
strp.Format("%c",hexdata.GetAt(i));
}
else
{
strp.Format("%02x ",hexdata.GetAt(i));
}
strtemp+=strp;
}
p->SetWindowText(strtemp);
}
}
void CA808MDlg::OnDeltaposSpinEditParameter(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
// TODO: Add your control notification handler code here
up_down=pNMUpDown->iDelta;
m_rxstate=WRITE_PARAMETER;
m_shortProcess=true;
*pResult++;
}
//将表3-1:从读出的数据(小数点的位置用一个数表示,放在接收到的字符最后一位)变成可显示的数
void CA808MDlg::strTostr(CString &ton)
{
CString temp,str;
char ch;
int answer=0;
int k,x,y;
temp=ton.Left(4);
ch=ton.GetAt(4);
answer=atoi((const char*)temp);
k=atoi(&ch);
switch(k)
{
case 0:
case 5: //无小数
x=answer;
break;
case 1:
case 6: //一位小数
x=answer/10;
y=answer%10;
break;
case 2:
case 7: //2位小数
x=answer/100;
y=answer%100;
break;
case 3:
case 8: //3位小数
x=answer/1000;
y=answer%1000;
}
if(k>4) //大于5是负数
x=-x;
if(k==0 ||k==5)
{
str.Format("%i",x);
}
else
{
str.Format("%i.%i",x,y);
}
ton=str;
}
//转换数据
void CA808MDlg::strToData(CString &str)
{
int len=str.GetLength();
int x=0;
int y=0;
if(len>6)
{
MessageBox("字数太多",NULL,MB_OK);
return;
}
x=str.Find('.');
if(x==-1)
{
y=0; //最后面应补的字
}
else //有小数点
{
y=len-x-1; //最后面应补的字
CString left=str.Left(x);
CString righ=str.Right(len-x-1);
str=left+righ; //去小数点
}
if(str.GetAt(0)=='-')
{
y+=5; //是负数加上5
str.Delete(0); //去掉负号
}
str+=(char)(y+0x30);
}
CString CA808MDlg::GetCommandFromParameter(CString field)
{
POSITION pos=NULL;
int i;
for(pos=this->commandeName_parameter_list[1].GetHeadPosition(),i=0;pos!=NULL;i++)
{
if(field==this->commandeName_parameter_list[1].GetNext(pos))
{
return commandeName_parameter_list[0].GetAt(commandeName_parameter_list[0].FindIndex(i));
}
}
return CString("");
}
CString CA808MDlg::GetParamterFromCommand(CString field)
{
POSITION pos=NULL;
int i;
for(pos=this->commandeName_parameter_list[0].GetHeadPosition(),i=0;pos!=NULL;i++)
{
if(field==this->commandeName_parameter_list[0].GetNext(pos))
{
return commandeName_parameter_list[1].GetAt(commandeName_parameter_list[1].FindIndex(i));
}
}
return CString("");
}
void CA808MDlg::InitCHistogramCtrl()
{
// CRect rect;
// GetDlgItem(IDC_STATIC_HISTOGRAM)->GetWindowRect(rect);
//ScreenToClient(rect);
// m_ctrlHistogram.Create(WS_VISIBLE | WS_CHILD | WS_TABSTOP, rect, this, 1000);
// m_ctrlHistogram.SetRange(1, 200);
// m_ctrlHistogram.SetSpeed(CHistogramCtrl::HIGH_SPEED);
//m_ctrlHistogram.SetGridsColor(RGB(0, 0, 0));
//m_ctrlHistogram.SetBkColor(RGB(255, 255, 255));
//m_ctrlHistogram.SetPen(2, RGB(255, 0, 0));
// Randomize();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -