寫了一個串口接收的上位機,字符接收正常,請問怎么實作接收16進制資料并顯示在編輯框中,在緩沖區種的資料是“\x1f\xff”這種,要在編輯框顯示1f ff,看了其他人的代碼像這樣
variant_inp = m_MSComm.get_Input(); //讀緩沖區但是會出現程式崩潰的情況,求大神解決將將緩沖區的16進制資料讀出來顯示在編輯框。
safearray_inp = variant_inp; //VARIANT型變數轉換為ColeSafeArray型變數
len = safearray_inp.GetOneDimSize(); //得到有效資料長度
for (k = 0; k<len; k++)
safearray_inp.GetElement(&k, rxdata + k);//轉換為BYTE型陣列
for (k = 0; k<len; k++) //將陣列轉換為Cstring型變數
{
BYTE bt = *(char*)(rxdata + k); //字符型
if (m_ctrlHexDiaplay.GetCheck())
strtemp.Format("%02X ", bt); //將字符以十六進制方式送入臨時變數strtemp存放,注意這里加入一個空隔
else
strtemp.Format("%c", bt); //將字符送入臨時變數strtemp存放
m_EditReceive += strtemp; //加入接收編輯框對應字串
}
uj5u.com熱心網友回復:
僅供參考:void HexDump(char *buf,int len,int addr) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%08x -",i+addr);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
uj5u.com熱心網友回復:
僅供參考:int CSCommTestDlg::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=https://bbs.csdn.net/topics/ConvertHexChar(hstr);
lowhexdata=https://bbs.csdn.net/topics/ConvertHexChar(lstr);
if((hexdata=https://bbs.csdn.net/topics/=16)||(lowhexdata==16))
break;
else
hexdata=https://bbs.csdn.net/topics/hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
//這是一個將字符轉換為相應的十六進制值的函式
//好多C語言書上都可以找到
//功能:若是在0-F之間的字符,則轉換為相應的十六進制字符,否則回傳-1
char CSCommTestDlg::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);
}
發送那邊的代碼:
UpdateData(TRUE); //讀取編輯框內容
if(m_ctrlHexSend.GetCheck())
{
CByteArray hexdata;
int len=String2Hex(m_strTXData,hexdata); //此處回傳的len可以用于計算發送了多少個十六進制數
m_ctrlComm.SetOutput(COleVariant(hexdata)); //發送十六進制資料
}
else
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//發送ASCII字符資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/106608.html
標籤:基礎類
上一篇:9 月直播課預告 | CODING DevOps 深度決議系列上線啦
下一篇:win7 系統服務編程問題
