📄 cf_test_dlg.cpp
字号:
COMMAND.Format("ZLG:%02X%08X%02X",CommandCode,NULL,SectorCount);//将字符送入临时变量strtemp存放
m_COMM.SetOutput(COleVariant(COMMAND)); //发送数据
}
BEGIN_EVENTSINK_MAP(CCF_TEST_Dlg, CDialog)
//{{AFX_EVENTSINK_MAP(CCF_TEST_Dlg)
ON_EVENT(CCF_TEST_Dlg, IDC_COMM, 1 /* OnComm */, OnCom, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
/***********************************************************
** 函数名称: CString IntToASCII(unsigned char input)
** 功能描述: 将两位的无符号整数转换为字符串
** 输 入: unsigned char input : 16进制数
** 输 出: input 的字符串形式
** 例 如: 0xFF - > "FF"
************************************************************/
CString IntToASCII(unsigned char input)
{
char temp[2];
char exchange;
CString output = "";
itoa(input,temp,16); //结果高位放于temp[0],低位放于temp[1]
if (temp[1] == 0) //因为如果input为0x0F 时,结果为 'F','0';
{ //所以要交换一下temp[1]与temp[0]
exchange = temp[1];
temp[1] = temp[0];
temp[0] = exchange;
}
if (temp[0] == 0) output += "0";
else output += temp[0];
if (temp[1] == 0) output += "0";
else output += temp[1];
return output;
}
/***********************************************************
** 函数名称: void StrToHex(CString str,__int16 len,unsigned char *databuff)
** 功能描述: 将一串字符串转换为一串两位的16进制数
** 输 入: CString str : 输入的字符串
__int16 len : 字符串的长度
** 输 出: unsigned char *databuff : 输出的16进制数串
** 例 如: "FF" - > 0xFF ; "1236" - > 12 36
** 备 注:len <= 24
************************************************************/
void StrToHex(CString str,__int16 len,unsigned char *databuff)
{
__int16 intdata[12]; //len必须小于等于12
for (__int16 i = 0; i < len; i++)
{
CString StrChar = str.Mid(2 * i,2); //取出其中的两个字符
sscanf(StrChar,"%x",&intdata[i]); //转换为16进制数
databuff[i] = (unsigned char)intdata[i];
}
}
void CCF_TEST_Dlg::OnCom()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
CString strtemp;
// PIDINFO pIdInfo;
len = m_COMM.GetCommEvent();
if(m_COMM.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ //以下你可以根据自己的通信协议加入处理代码
variant_inp=m_COMM.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++,RXDATALEN++)
{
safearray_inp.GetElement(&k,rxdata+RXDATALEN); //转换为BYTE型数组
}
switch(CommandCode) //指令数据处理
{
case 0xE0: // 电机停止转动
if((RXDATALEN >= 7)&&
(rxdata[0]=='S')&&(rxdata[1]=='T')&&
(rxdata[2]=='A')&&(rxdata[3]=='T')&&
(rxdata[4]=='E')&&(rxdata[5]==':'))
{
RXDATALEN =0;
CommandCode = 0xff;
if(rxdata[6]=='Y')
{
m_Edit_State="电机停止转动"; //指令执行正确
}
else
m_Edit_State="指令执行出错!"; //指令执行出错
}
else
m_Edit_State="指令正在执行...";
break;
case 0xE1: // 电机开始转动
if((RXDATALEN >= 7)&&
(rxdata[0]=='S')&&(rxdata[1]=='T')&&
(rxdata[2]=='A')&&(rxdata[3]=='T')&&
(rxdata[4]=='E')&&(rxdata[5]==':'))
{
RXDATALEN=0;
CommandCode = 0xff;
if(rxdata[6]=='Y')
{
m_Edit_State="硬盘开始转动。"; //指令执行正确
}
else
m_Edit_State="指令执行出错"; //指令执行出错
}
else
m_Edit_State="指令正在执行...";
break;
case 0x30: //写扇区
if((RXDATALEN >= 7)&&
(rxdata[0]=='S')&&(rxdata[1]=='T')&&
(rxdata[2]=='A')&&(rxdata[3]=='T')&&
(rxdata[4]=='E')&&(rxdata[5]==':'))
{
RXDATALEN=0;
CommandCode = 0xff;
if(rxdata[6]=='Y')
{
m_Edit_State="写扇区指令执行正确。"; //指令执行正确
}
else
m_Edit_State="写扇区指令执行出错"; //指令执行出错
}
else
m_Edit_State="指令正在执行...";
break;
case 0x20: //读扇区
if((RXDATALEN == 6)&&
(rxdata[0]=='S')&&(rxdata[1]=='T')&&
(rxdata[2]=='A')&&(rxdata[3]=='T')&&
(rxdata[4]=='E')&&(rxdata[5]==':'))
{
RXDATALEN=0;
CommandCode = 0xff;
if(rxdata[6]=='N')
m_Edit_State="读扇区指令执行失败,请检查设备是否连接好!"; //指令执行出错
else
m_Edit_State="通讯出错请重新运行开发板程序!"; //通讯出错,请重新开始
}
else
if(RXDATALEN >= (UINT)(SectorCount*512+7))
{
if( (rxdata[SectorCount*512+0]=='S')&&
(rxdata[SectorCount*512+1]=='T')&&
(rxdata[SectorCount*512+2]=='A')&&
(rxdata[SectorCount*512+3]=='T')&&
(rxdata[SectorCount*512+4]=='E')&&
(rxdata[SectorCount*512+5]==':'))
{
RXDATALEN=0;
CommandCode = 0xff;
if(rxdata[SectorCount*512+6]=='Y')
{
int i = m_ComboRXData.GetCurSel();
if(i==0)// 16进制显示
{
for(k=0;k<512;k++)
{ BYTE bt;
if((k%0x10)==0)
{
strtemp.Format("%08X:",k); //将字符送入临时变量strtemp存放
m_Show+=strtemp; //加入接收编辑框对应字符串
}
bt=*(char*)(rxdata+k);
strtemp.Format("%02X ",bt); //将字符送入临时变量strtemp存放
m_Show+=strtemp; //加入接收编辑框对应字符串
}
}
else// ASCII显示
{
for(k=0;k<512;k++)
{
BYTE bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_Show+=strtemp; //加入接收编辑框对应字符串
}
}
// IntToASCII
strtemp.Format("%c%c",13,10); //回车,换行
m_Show+=strtemp;
strtemp.Format("%c%c",13,10); //回车,换行
m_Show+=strtemp;
m_Edit_State="读扇区指令正常完成。"; //指令执行正确
}
}
else
m_Edit_State="通讯出错请重新运行开发板程序!"; //通讯出错,请重新开始
}
else
m_Edit_State="正在执行...";
break;
case 0xEC: //获取设备识别信息
if((RXDATALEN == 6)&&
(rxdata[0]=='S')&&(rxdata[1]=='T')&&
(rxdata[2]=='A')&&(rxdata[3]=='T')&&
(rxdata[4]=='E')&&(rxdata[5]==':'))
{
if(rxdata[6]=='N')
m_Edit_State="获取设备信息指令执行失败,请检查设备是否连接好!"; //指令执行出错
else
m_Edit_State="通讯出错请重新运行开发板程序!"; //通讯出错,请重新开始
}
if( RXDATALEN >= 64+7) //只接收设备型号(40字节)、序列号(20字节)、扇区总数(4字节)等信息
if( (rxdata[64]=='S')&&
(rxdata[65]=='T')&&
(rxdata[66]=='A')&&
(rxdata[67]=='T')&&
(rxdata[68]=='E')&&
(rxdata[69]==':'))
{
RXDATALEN=0;
CommandCode = 0xff;
if(rxdata[70]=='Y')
{
for(k=0;k<20;k+=2) //将数组转换为Cstring型变量
{ //注意设备型号为大端
BYTE bt=*(char*)(rxdata+k+1);
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_Model_Number+=strtemp; //加入接收编辑框对应字符串
bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt);
m_Model_Number+=strtemp; //加入接收编辑框对应字符串
}
for(k=20;k<40;k+=2) //将数组转换为Cstring型变量
{ //注意设备型号为大端
BYTE bt=*(char*)(rxdata+k+1);
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_Model_Number2+=strtemp; //加入接收编辑框对应字符串
bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt);
m_Model_Number2+=strtemp; //加入接收编辑框对应字符串
}
for(k=40;k<60;k+=2) //将数组转换为Cstring型变量
{ //注意设备序列号为大端
BYTE bt=*(char*)(rxdata+k+1);
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_Serial_Number+=strtemp; //加入接收编辑框对应字符串
bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt);
m_Serial_Number+=strtemp; //加入接收编辑框对应字符串
}
TotlaSectors = rxdata[60]+
rxdata[61]*0x100+
rxdata[62]*0x10000+
rxdata[63]*0x1000000;
m_TotalSector.Format("0x%X",TotlaSectors);
m_Edit_State="获取设备信息指令完成。"; //指令执行正确
}
else
m_Edit_State="获取设备信息指令执行失败,请检查设备是否连接好!"; //指令执行出错
}
else
m_Edit_State="指令正在执行...";
break;
default:
break;
}
}
// int temp = sizeof(IDINFO);
// memcpy((PIDINFO)&IdInfo, rxdata, sizeof(IDINFO)); //拷贝内存
UpdateData(FALSE); //更新编辑框内容
}
void CCF_TEST_Dlg::OnSelchangeComport()
{
int i = m_COMPort.GetCurSel();
if(i==0)
{
if(m_COMM.GetPortOpen())
m_COMM.SetPortOpen(FALSE);
m_COMM.SetCommPort(1); //选择com1
if( !m_COMM.GetPortOpen())
{
m_COMM.SetPortOpen(TRUE);//打开串口
CString COMMAND;
CommandCode = 0xEC;
SectorCount = 1;
COMMAND.Format("ZLG:%02X%08X%02X",CommandCode,NULL,SectorCount);//将字符送入临时变量strtemp存放
m_COMM.SetOutput(COleVariant(COMMAND)); //发送数据
m_Model_Number="";
m_Model_Number2="";
m_Serial_Number="";
}
else
AfxMessageBox("cannot open serial port");
}
if(i==1)
{
if(m_COMM.GetPortOpen())
m_COMM.SetPortOpen(FALSE);
m_COMM.SetCommPort(2); //选择com1
if( !m_COMM.GetPortOpen())
{
m_COMM.SetPortOpen(TRUE);//打开串口
CString COMMAND;
CommandCode = 0xEC;
SectorCount = 1;
COMMAND.Format("ZLG:%02X%08X%02X",CommandCode,NULL,SectorCount);//将字符送入临时变量strtemp存放
m_COMM.SetOutput(COleVariant(COMMAND)); //发送数据
m_Model_Number="";
m_Model_Number2="";
m_Serial_Number="";
}
else
AfxMessageBox("cannot open serial port");
}
}
void CCF_TEST_Dlg::OnSelchangeByteType()
{
// TODO: Add your control notification handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -