📄 cf_test_dlg.cpp
字号:
{
if(Sector<TotlaSectors)
{
//=============== 发送命令 ===============
BYTE sendbuff[16] = {'Z','L','G',':',
'3','0',
0x30+(UCHAR)(Sector>>28),0x30+(UCHAR)(Sector>>24),0x30+(UCHAR)(Sector>>20),0x30+(UCHAR)(Sector>>16),0x30+(UCHAR)(Sector>>12),0x30+(UCHAR)(Sector>>8),0x30+(UCHAR)(Sector>>4),0x30+(UCHAR)Sector,
'0','1'};
int ret = Comm.SendData(sendbuff, NULL, 16, 500, 1, 0, FALSE); //发送数据
if (ret != 0)
{ MessageBox("与LPC2200 连接失败,请检查硬件!");
m_Edit_State = "与LPC2200 通信失败!";
UpdateData(FALSE);
return;
}
// m_Send.
int len=m_Send.GetLength();
int i;
CString COMMAND="";
CString strtemp;
if(len<512)
{
len = 512-len;
COMMAND=m_Send;
for(i=0;len>i;i++)
{
strtemp.Format("%C",0x20);//填充数0x00
COMMAND += strtemp;
//m_COMM.SetOutput(COleVariant(strtemp));
}
}
for(i=0;32>i;i++)
{ UINT k;
strtemp=COMMAND.Mid(0x10*i,0x10);
for(k=0;k<0x1fffff;k++);
int ret = Comm.SendData((UCHAR *)(LPCTSTR)strtemp, NULL, 16, 500, 1, 0, FALSE); //发送数据
if (ret != 0)
{ MessageBox("与LPC2200 连接失败,请检查硬件!");
m_Edit_State = "与LPC2200 通信失败!";
UpdateData(FALSE);
return;
}
}
// 读回状态
BYTE rxdata[7] ;
ret = Comm.ReadBlock(rxdata, 7, 500); //读出数据
if (ret != 0)
{ MessageBox("与LPC2200 连接失败,请检查硬件!");
m_Edit_State = "与LPC2200 通信失败!";
UpdateData(FALSE);
return;
}
if( (rxdata[0]=='S')&&(rxdata[1]=='T')&&
(rxdata[2]=='A')&&(rxdata[3]=='T')&&
(rxdata[4]=='E')&&(rxdata[5]==':'))
{
if(rxdata[6]=='Y')
{
m_Edit_State="写扇区指令执行正确。"; //指令执行正确
}
else
m_Edit_State="写扇区指令执行出错"; //指令执行出错
}
else
m_Edit_State="接收状态无效"; //指令执行出错
UpdateData(FALSE);
}
else
AfxMessageBox("需要操作的扇区号,超出寻址范围!");
}
}
void CCF_TEST_Dlg::OnIDEstrat() //硬盘开始转动
{
//=============== 发送命令 ===============
BYTE sendbuff[16] = {'Z','L','G',':',
'E','1',
'0','0','0','0','0','0','0','0',
'0','1'};
int ret = Comm.SendData(sendbuff, NULL, 16, 500, 1, 0, FALSE); //发送数据
if (ret != 0)
{ MessageBox("与LPC2200 连接失败,请检查硬件!");
m_Edit_State = "与LPC2200 通信失败!";
UpdateData(FALSE);
return;
}
m_Edit_State = "等待硬盘电机起动!";
UpdateData(FALSE);
// 读回状态
BYTE rxdata[7] ;
ret = Comm.ReadBlock(rxdata, 7, 100000); //读出数据
if (ret != 0)
{ MessageBox("与LPC2200 连接失败,请检查硬件!");
m_Edit_State = "与LPC2200 通信失败!";
UpdateData(FALSE);
return;
}
if( (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="接收状态无效"; //指令执行出错
UpdateData(FALSE);
}
void CCF_TEST_Dlg::OnIdestop() //硬盘停止转动
{
//=============== 发送命令 ===============
BYTE sendbuff[16] = {'Z','L','G',':',
'E','0',
'0','0','0','0','0','0','0','0',
'0','1'};
int ret = Comm.SendData(sendbuff, NULL, 16, 500, 1, 0, FALSE); //发送数据
if (ret != 0)
{ MessageBox("与LPC2200 连接失败,请检查硬件!");
m_Edit_State = "与LPC2200 通信失败!";
UpdateData(FALSE);
return;
}
// 读回状态
BYTE rxdata[7] ;
ret = Comm.ReadBlock(rxdata, 7, 500); //读出数据
if (ret != 0)
{ MessageBox("与LPC2200 连接失败,请检查硬件!");
m_Edit_State = "与LPC2200 通信失败!";
UpdateData(FALSE);
return;
}
if( (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="接收状态无效"; //指令执行出错
UpdateData(FALSE);
}
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];
}
}
//********************************************************************************************
// 选择串口,初始化串口获取CF卡信息
//********************************************************************************************
void CCF_TEST_Dlg::OnSelchangeComport()
{
CString strtemp;
m_Model_Number="";
m_Model_Number2="";
m_Serial_Number="";
TotlaSectors = 0;
int i = m_COMPort.GetCurSel();
Comm.ClosePort();
BOOL bret = Comm.SetCommPort(i+1); //设置串口号
if (bret == FALSE)
{ MessageBox("打开串口失败!");
return;
}
bret = Comm.SetCommBaud(19200); //设置波特率
if (bret == FALSE)
{ MessageBox("设置波特率失败!");
return;
}
int ret = Comm.OpenPort(); //打开串口
if (bret == 0)
{ MessageBox("打开串口失败!");
return;
}
//=============== 发送命令 ===============
BYTE sendbuff[16] = {'Z','L','G',':',
'E','C',
'0','0','0','0','0','0','0','0',
'0','0'};
ret = Comm.SendData(sendbuff, NULL, 16, 500, 1, 0, FALSE); //发送数据
if (ret != 0)
{
MessageBox("与LPC2200 连接失败,请检查硬件!");
m_Edit_State = "与LPC2200 通信失败!";
UpdateData(FALSE);
return;
}
// 读回数据
BYTE rxdata[100] ;
ret = Comm.ReadBlock(rxdata, 71, 500); //读出数据
if (ret != 0)
{
MessageBox("与LPC2200 连接失败,请检查硬件连接、串口号、波特率!");
m_Edit_State = "与LPC2200 通信失败!";
UpdateData(FALSE);
return;
}
if( (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="通讯出错请重新运行开发板程序!"; //通讯出错,请重新开始
}
//只接收设备型号(40字节)、序列号(20字节)、扇区总数(4字节)等信息
if( (rxdata[64]=='S')&& (rxdata[65]=='T')&&
(rxdata[66]=='A')&& (rxdata[67]=='T')&&
(rxdata[68]=='E')&& (rxdata[69]==':'))
{
if(rxdata[70]=='Y')
{
for( int k=0;k<20;k+=2) //将数组转换为Cstring型变量
{ //注意设备型号为大端
strtemp.Format("%c",rxdata[k+1]); //将字符送入临时变量strtemp存放
m_Model_Number+=strtemp; //加入接收编辑框对应字符串
strtemp.Format("%c",rxdata[k]);
m_Model_Number+=strtemp; //加入接收编辑框对应字符串
}
for(k=20;k<40;k+=2) //将数组转换为Cstring型变量
{ //注意设备型号为大端
strtemp.Format("%c",rxdata[k+1]); //将字符送入临时变量strtemp存放
m_Model_Number2+=strtemp; //加入接收编辑框对应字符串
strtemp.Format("%c",rxdata[k]);
m_Model_Number2+=strtemp; //加入接收编辑框对应字符串
}
for(k=40;k<60;k+=2) //将数组转换为Cstring型变量
{ //注意设备序列号为大端
strtemp.Format("%c",rxdata[k+1]); //将字符送入临时变量strtemp存放
m_Serial_Number+=strtemp; //加入接收编辑框对应字符串
strtemp.Format("%c",rxdata[k]);
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="指令正在执行...";
UpdateData(FALSE);
}
void CCF_TEST_Dlg::OnSelchangeByteType()
{
// TODO: Add your control notification handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -