📄 commwizarddlg.cpp
字号:
if(setDlg.DoModal() == IDOK)
{
m_nPort = setDlg.nPort;
m_nTime = setDlg.nTime;
m_strSettings = setDlg.strSettings;
// m_strSendString = setDlg.strSendString;
}
OpenPort();
SetTimer(1,SETTIMEAMOUNT,NULL);//时间为SETTIMEAMOUNT=1000毫秒
}
void CCommWizardDlg::OnSelchangeType()
{
// TODO: Add your control notification handler code here
// m_nInputMode = m_ctrlDataType.GetCurSel();
}
void CCommWizardDlg::OnClear()
{
// TODO: Add your control notification handler code here
// m_strReceive = _T("");
m_strReceive = _T("");
UpdateData(FALSE);//重新更新文本显示,以字符串m_strReceive
/* m_EditRecv.SetSel(0,-1); //全选
m_EditRecv.ReplaceSel(m_strReceive); //填入内容
m_EditRecv.ScrollWindow(0,0); //滚动到插入点 */
// UpdateData(true);//重新更新文本显示,以字符串m_strReceive
// int i=0;
}
BEGIN_EVENTSINK_MAP(CCommWizardDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CCommWizardDlg)
ON_EVENT(CCommWizardDlg, IDC_COMMCTRL, 1 /* OnComm */, OnOnCommCommctrl, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CCommWizardDlg::OnOnCommCommctrl()
{
// TODO: Add your control notification handler code here
/* VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
int i;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;*/
if(bStartTest)
{
if(m_Com.GetCommEvent()==2)//接收服务
{
FunCdtReServer();
}
if(m_Com.GetCommEvent()==1) //发送服务。事件值为1表示发送缓冲区内没有字符,可以填充
{
if(!GlSendFrameFlag)//判断上一帧数据是否发送完毕
{
fun_make_send_frame();//上一帧数据发送完毕,则重新组帧
GlSendFrameFlag=true;//置帧数据未发送完毕标志
}
FunCdtTrServer();//发送帧数据
}//end if(m_Com.GetCommEvent()==1)
// if(!GlThisPageDispFlag)//本页已显示标记,防止显示的太快
// {
// UpdateData(FALSE);//更新编辑框显示的内容
m_EditRecv.SetSel(-1,-1); //将插入光标放在最后
m_EditRecv.ReplaceSel(m_strReceive); //填入内容
m_EditRecv.ScrollWindow(0,0); //滚动到插入点
m_strReceive = _T("");
// }
// else
// {
// GlThisPageDispFlag=0;
// }
}//end if(bReceive)
}
void CCommWizardDlg::OpenPort()
{
if(m_Com.GetPortOpen())
m_Com.SetPortOpen(FALSE);
m_Com.SetCommPort(m_nPort); //选择com口
if( !m_Com.GetPortOpen())
m_Com.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");
m_Com.SetSettings(m_strSettings); //波特率,校验,数据位,停止位
m_Com.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_Com.SetSThreshold(1); //参数1表示每当串口发送缓冲区中空时将引发一个发送数据的OnComm事件
m_Com.SetInputMode(1);
m_Com.SetInputLen(0); //设置当前接收区数据长度为0
m_Com.GetInput();//先预读缓冲区以清除残留数据
}
//DEL void CCommWizardDlg::OnCdtsend()
//DEL {
//DEL
//DEL }
void CCommWizardDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
// OnCdtsend();
/* //串口通信情况判断计时器
pub_com_t_cou++;
//串口未收到网控数据情况判断计时器
pub_com_nre_t_cou++;
//串口未收到网控数据情况判断计时及标志
if(pub_com_nre_t_cou>=10)
{
pub_com_ner_error_cou++;
pub_com_nre_t_cou=0;
}*/
GlYxTimeCou++;
if(GlYxTimeCou>=YXTIMEAMOUNT)//已过了30秒
{
GlYxFrameFlag=1;//置遥信组帧时间到标志
GlYxTimeCou=0;//清遥信发送定时计数器
}
GlYmTimeCou++;
if(GlYmTimeCou>=YMTIMEAMOUNT)//已过了40秒
{
GlYmFrameFlag=1;//置遥信组帧时间到标志
GlYmTimeCou=0;//清遥信发送定时计数器
}
CDialog::OnTimer(nIDEvent);
}
int CCommWizardDlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
//这是一个将字符转换为相应的十六进制值的函数
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CCommWizardDlg::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}
//DEL int CCommWizardDlg::fun_re_data_handle()
//DEL {
//DEL int i;
//DEL // BYTE
//DEL // unsigned int re_syn_flag;
//DEL // pub_re_data_buf[pub_re_data_cou++]=re_data[k];
//DEL if(m_nInputMode==2)//部颁规约
//DEL {
//DEL i=fun_re_dlb_data_handle();
//DEL }
//DEL else if(m_nInputMode==1)//威盛规约
//DEL {
//DEL i=fun_re_wsh_data_handle();
//DEL }
//DEL return i;
//DEL }
void CCommWizardDlg::fun_make_send_frame()
{
if(GlYxFrameFlag)//组遥信帧时间到
{
FunMakeCDTYxFrame();
GlYxFrameFlag=0;//清遥信组帧时间到标记
GlYxTimeCou=0;//清遥信定时传送计数器
// GlSendFrameFlag=1;//置帧数据未发送完毕标志
}
else if(GlYmFrameFlag)//组脉冲电度帧时间到
{
FunMakeCDTYmFrame();
GlYmFrameFlag=0;//清电度组帧时间到标记
GlYmTimeCou=0;//清电度定时传送计数器
// GlSendFrameFlag=1;//置帧数据未发送完毕标志
}
else
{
FunMakeCDTYcFrameCycle();//循环组遥测帧(重要遥测、次要遥测、一般遥测)
// GlSendFrameFlag=1;//置帧数据未发送完毕标志
}
}
int CCommWizardDlg::fun_hex_to_array(CByteArray &senddata,unsigned char *Loc_send_data_buf,int Loc_send_data_len)
{
// int hexdata,lowhexdata;
int hexdatalen=0;
// int len=str.GetLength();
senddata.SetSize(Loc_send_data_len);
for(int i=0;i<Loc_send_data_len;i++)
{
senddata[hexdatalen]=(char)Loc_send_data_buf[i];
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
//程序标志、外部变量、资源初始化
void CCommWizardDlg::FunInitSys()
{
GlSendFrameFlag=false;
GlYcFrameCou=1;//置遥测组帧循环计数初值
GlYxFrameFlag=0;//清遥信组帧时间到标记
GlYxTimeCou=0;//清遥信定时传送计数器
pub_send_data_len=0;
dire_send_long=0;
CDT_syn_cou=0;
GlRowCharCou=0;
GlCDTCharDispCou=0;//清CDT模式字符显示计数
GlThisPageDispFlag=0;//本页已显示标记
//测试用发送遥测数据共YCDOTAMOUNT(256)点,数值从0-255
for(int i=0;i<YCDOTAMOUNT;i++)
{
GlYcDataCur[i]=i;
}
GlYmTimeCou=0;
GlYmFrameFlag=0;//清脉冲电度量组帧时间到标记
//测试用发送电度数据共YMDOTAMOUNT(64)点遥测,数值从0-63
for(i=0;i<YMDOTAMOUNT;i++)
{
GlYmDataCur[i]=i;
}
/*
DisplayrowAmount 100//大于30行清掉本页重新显示
#define DisplayrowLen 42//每行显示字符数
*/
//初始化cedit m_EditRecv
UINT LocSetEditCharAmount=(DisplayrowAmount+1)*DisplayrowLen*3;
m_EditRecv.SetLimitText(LocSetEditCharAmount);
}
/*
void CCommWizardDlg::fun_make_p_feng_frame()
{
unsigned int i,HE_code;
// unsigned char for_crc_data[6];
pub_send_data_buf[0]=0x68;
pub_send_data_buf[1]=pub_re_data_buf[1];
pub_send_data_buf[2]=pub_re_data_buf[2];
pub_send_data_buf[3]=pub_re_data_buf[3];
pub_send_data_buf[4]=pub_re_data_buf[4];
pub_send_data_buf[5]=pub_re_data_buf[5];
pub_send_data_buf[6]=pub_re_data_buf[6];
pub_send_data_buf[7]=0x68;
pub_send_data_buf[8]=0x81;
pub_send_data_buf[9]=6;
pub_send_data_buf[10]=pub_re_data_buf[10];
pub_send_data_buf[11]=pub_re_data_buf[11];
pub_send_data_buf[12]=0x03;
pub_send_data_buf[13]=0x03;
pub_send_data_buf[14]=0x03;
pub_send_data_buf[15]=0x03;
for(i=0;i<4;i++) pub_send_data_buf[i+12]+=0x33;
HE_code=0;
for(i=0;i<16;i++) HE_code+=pub_send_data_buf[i];
pub_send_data_buf[16]=HE_code;
pub_send_data_buf[17]=0x16;
pub_send_data_len=18;
}
*/
void CCommWizardDlg::FunMakeCDTYxFrame()
{
unsigned int t_yx_word,i,j;
unsigned char t_frame_temp[6];
// unsigned int for_send_direc;
// for_send_direc=ex_str_cdt_relax[for_direc_code].this_direc_code;
// t_yx_word=(exstr_agree_layer_para+for_direc_code)->agree_union.cdt_agree.cdt_yx_num;
t_yx_word=YXDOTAMOUNT/32;//t_yx_word:信息字个数。一个遥信信息字(4个信息字节、一个功能码字节、一个校验字节)可传送32点遥测
if(YXDOTAMOUNT%32!=0)
{
t_yx_word++;
}
for(i=0;i<6;i++)//同步头
{
pub_send_data_buf[i]=CDT_syn_array[DireCycle][i];
}
t_frame_temp[0]=0x71;
t_frame_temp[1]=0xf4;
t_frame_temp[2]=t_yx_word;
t_frame_temp[3]=GlSourAddr;
GlSourAddr++;//源站址加1用于测试
t_frame_temp[4]=GlAimAddr;
t_frame_temp[5]=CRC_check(t_frame_temp,VeriDireCycle);//求本信息字的CRC校验,0:指取CRC正码表;1:指取反码。默认为0
for(i=0;i<6;i++)//控制字
{
pub_send_data_buf[i+6]=t_frame_temp[i];
}
j=0;
while(j<t_yx_word)//信息字
{
pub_send_data_buf[(j+2)*6+0]=0xf0+j;
for(i=0;i<4;i++)
{pub_send_data_buf[(j+2)*6+i+1]=GlYxDataCur[j*4+i];
}
pub_send_data_buf[(j+2)*6+5]=CRC_check(&pub_send_data_buf[(j+2)*6+0],VeriDireCycle);
j++;
}
pub_send_data_len=(t_yx_word+2)*6;
dire_send_long=pub_send_data_len;
CDT_send_add_cou=0;
}
void CCommWizardDlg::FunMakeCDTYmFrame()
{
unsigned int t_yx_word,i;
unsigned char t_frame_temp[6];
unsigned int LocYmVal;
// unsigned int for_send_direc;
// for_send_direc=ex_str_cdt_relax[for_direc_code].this_direc_code;
// t_yx_word=(exstr_agree_layer_para+for_direc_code)->agree_union.cdt_agree.cdt_yx_num;
t_yx_word=YMDOTAMOUNT;//t_yx_word:信息字个数。一个遥信信息字(4个信息字节、一个功能码字节、一个校验字节)可传送32点遥测
for(i=0;i<6;i++)//同步头
{
pub_send_data_buf[i]=CDT_syn_array[DireCycle][i];
}
t_frame_temp[0]=0x71;
t_frame_temp[1]=0x85;
t_frame_temp[2]=t_yx_word;
t_frame_temp[3]=GlSourAddr;
GlSourAddr++;//源站址加1用于测试
t_frame_temp[4]=GlAimAddr;
t_frame_temp[5]=CRC_check(t_frame_temp,VeriDireCycle);//求本信息字的CRC校验,0:指取CRC正码表;1:指取反码。默认为0
for(i=0;i<6;i++)//控制字
{
pub_send_data_buf[i+6]=t_frame_temp[i];
}
unsigned int j=0;
while(j<t_yx_word)//信息字
{
pub_send_data_buf[(j+2)*6+0]=0xa0+j;
LocYmVal=GlYmDataCur[j];
pub_send_data_buf[(j+2)*6+1]=(unsigned char)LocYmVal;
LocYmVal=LocYmVal>>8;
pub_send_data_buf[(j+2)*6+2]=(unsigned char)LocYmVal;
LocYmVal=LocYmVal>>8;
pub_send_data_buf[(j+2)*6+3]=(unsigned char)LocYmVal;
LocYmVal=LocYmVal>>8;
pub_send_data_buf[(j+2)*6+4]=(unsigned char)LocYmVal;
pub_send_data_buf[(j+2)*6+5]=CRC_check(&pub_send_data_buf[(j+2)*6+0],VeriDireCycle);
j++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -