最近工作中用到向串口发送16进制命令,所以就需要将输入的内容转为16进制。
由于要向串口发送16进制命令,所以我将命令存入unsigned char数组中。
代码:
char ncharGlobalCommandRes[9]={0xaa,0x55,0x77,0x70,0x07,0x00,0x00,0x00,0xed}; //串口命令
CString nstrResolution;
char buff[2]={0x00};
unsigned int ntemp;
GetDlgItemText(IDC_Global_Edit_EncoderResolution,nstrResolution); //获取编辑框字符串内容
ntemp=atoi(nstrResolution); //字符串转为整形数据
_itoa(ntemp,buff,16); //将整形数据转换为16进制数据存入buff数组,使用中注意ntemp超出buff范围
int flag=sscanf(buff,"%2x%2x",&ncharGlobalCommandRes[6],&ncharGlobalCommandRes[7]); //%2x中数字为确定读入字符长度
ncharGlobalCommandRes[8]=0xed;
/*下面这种方法也是可以的,但是学艺不精对sscanf不够了解,现已解决,复制的命令多了一条,会覆盖串口命令中的最后一个,需要重新再赋值;*/
//nstrResolution.Format("%x",ntemp); //也可以这样转换为16进制
//sscanf的使用要特别注意,理解好参数的格式,%2x中数字为确定读入字符长度;
//int flag=sscanf(nstrResolution,"%2x%2x",&ncharGlobalCommandRes[6],&ncharGlobalCommandRes[7]);
//ncharGlobalCommandRes[8]=0xed;
/*还有一种思路,我没有实现,不知道怎样把字符中的16进制内容,复制到另一个字符变量的内存中,保持16进制数据格式*/
//memcpy(buff,nstrResolution,nstrResolution.GetLength());
/*ncharGlobalCommandRes[6]=buff[0]; //怎样把16进制的字符内容,存入另一个字符内存中
ncharGlobalCommandRes[7]=buff[1];*/
下面是显示内容时,将数据转为16进制显示:
void CSetSignalBoxDlg::OnReceive(LPCSTR nstrText, LPCSTR nstrIP,UINT nPort,unsigned nlength)
{
CString nstr,nstrtemp;
unsigned char buf[1024];
CString nstrtap=" ";
CString nstrline="\r\n";
memcpy(buf,nstrText,nlength);
SetDlgItemText(IDC_EDIT_ServerIP,nstrIP);
CTime ntime = CTime::GetCurrentTime();
CString nstrtime = ntime.Format("%H:%M:%S");
//nstr+=nstrText;
//nstr+="\r\n";
nstr.Format("%s-%d-%s:\r\n",nstrIP,nPort,nstrtime);
int nLength=m_editOutput.GetWindowTextLength(); //获取当前文字长度
m_editOutput.SetSel(nLength,-1); //设置位置为末尾
m_editOutput.ReplaceSel(nstr);
for(int i=0;i
if (i%18==0&&i!=0) //每行显示18个字节的数据
{
m_editOutput.ReplaceSel(nstrline);
}
nstrtemp.Format("%02x",buf[i]);
m_editOutput.ReplaceSel(nstrtemp);
m_editOutput.ReplaceSel(nstrtap);
}
m_editOutput.ReplaceSel(nstrline);
m_editOutput.ReplaceSel(nstrline);
}