串口通讯,想要向51单片机发送图片。

Fulldata_Alchemist 2014-12-12 01:19:32
这是MFC上对应的一个按键的程序,发送的是32X16的单色图片
CFileDialog opendlg (TRUE,_T("*"),_T(".bmp"),OFN_OVERWRITEPROMPT, _T("所有文件(*.*;)|*.*||"),NULL);
if (opendlg.DoModal()==IDOK)
{
m_bmpfilename=opendlg.GetPathName();
GetDlgItem(IDC_EDIT3)->SetWindowText(m_bmpfilename);
}
//以下为读取BMP文件的程序

unsigned char *pBmpBuf;//读入图像数据的指针

FILE *fp=fopen(m_bmpfilename,"rb");//二进制读方式打开指定的图像文件

//if(fp==0) return 0;

//跳过位图文件头结构BITMAPFILEHEADER,和信息头结构

fseek(fp, sizeof(BITMAPFILEHEADER),0);
fseek(fp, sizeof(BITMAPINFOHEADER),0);
pBmpBuf=new unsigned char[64];
fread(pBmpBuf,1,64,fp);
unsigned char str[64];
for(int i=0;i<64;i++)
{
str[i]=*(pBmpBuf+i);
}
CString P;
P=str[64];
GetDlgItem(IDC_EDIT1)->SetWindowText(P);
m_ctrlComm.SetOutput(COleVariant(P));

fclose(fp);//关闭文件
delete []pBmpBuf;
为什么每次在编辑框里显示的总是h,求大神解答!
...全文
421 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fulldata_Alchemist 2014-12-18
  • 打赏
  • 举报
回复
感谢各位大大的指导
Fulldata_Alchemist 2014-12-13
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
字符串在遇到 0 时会被截断, 另外只有一部分字符可见, 可以转化为HEX的ASC字符显示
那要怎么转换呢?是用4楼的方法么?
schlafenhamster 2014-12-13
  • 打赏
  • 举报
回复
"ShowHex.zip" http://download.csdn.net/detail/schlafenhamster/7726787 "本程序 类似 UE 或 WinHex, 用于显示二进制文件的 Hex 格式."
schlafenhamster 2014-12-13
  • 打赏
  • 举报
回复

// Fill a string array in hex format
BOOL CShowHexDoc::StringBin()
{
BYTE *pTmp=m_pBuffer;
CString tmp;
CString prompt;

BYTE comment[40];
// if is there an old
m_HexStrArray.RemoveAll();
//
int FullRows=m_nSize/16;
int PartRow=m_nSize%16;
//
for(int rr=0;rr < FullRows ; rr++)
{//
tmp.Format("%05X:", 16*rr);//"10000:" 16 bytes
prompt+=tmp;
for(int col = 0;col < 16; col++)
{
if((*pTmp>' ') && (*pTmp<'z')) comment[col]=*pTmp;
else comment[col]='.';
tmp.Format("%02X ", *pTmp++);
prompt+=tmp;
}
comment[col]=0;
prompt+=" ";
prompt+=comment;
prompt+="\r\n";
m_HexStrArray.Add(prompt);
prompt.Empty();
}
//
if(PartRow!=0)
{
tmp.Format("%05X:", 8*rr);
prompt+=tmp;
for(int col = 0;col < PartRow; col++)
{
if((*pTmp>' ') && (*pTmp<'z')) comment[col]=*pTmp;
else comment[col]='.';
tmp.Format("%02X ", *pTmp++);
prompt+=tmp;
}
comment[col]=0;
while(col<16)
{// more spaces
prompt+=" ";//3
col++;
}
prompt+=" ";
prompt+=comment;
prompt+="\r\n";
m_HexStrArray.Add(prompt);
prompt.Empty();
}
//
return TRUE;
}


BYTE *pTmp=m_pBuffer;
是读进来的 二进制数组


笨笨仔 2014-12-12
  • 打赏
  • 举报
回复
函数声明忘了

	// ANSI To UNCODE转换
	CString AnsiToUnicode(char * szAnsi, int len=0);
笨笨仔 2014-12-12
  • 打赏
  • 举报
回复
使用以下函数转换一下

// ANSI To UNCODE转换
CString CStringProc::AnsiToUnicode(char * szAnsi, int len)
{
	CString str;
	// ansi to unicode
	//预转换,得到所需空间的大小
	int wcsLen;
	if(len>0)
		wcsLen=len;
	else
		wcsLen= ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
	//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
	wchar_t* wszString = new wchar_t[wcsLen + 1];
	//转换
	::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
	//最后加上'\0'
	wszString[wcsLen] = '\0';			// UNICODE字串
	str=wszString;
	delete wszString;
	return str;
}
调用此函数

CString P;
P=AnsiToUnicode(str);
GetDlgItem(IDC_EDIT1)->SetWindowText(P);
信阳毛尖 2014-12-12
  • 打赏
  • 举报
回复
CString P; P=str[64]; -----------------------------> CString P = str;
zgl7903 2014-12-12
  • 打赏
  • 举报
回复
字符串在遇到 0 时会被截断, 另外只有一部分字符可见, 可以转化为HEX的ASC字符显示
wyb1983510 2014-12-12
  • 打赏
  • 举报
回复
CString P; P=str[64]; GetDlgItem(IDC_EDIT1)->SetWindowText(P); m_ctrlComm.SetOutput(COleVariant(P)); 这里你把一个unsigned char赋值给一个字符串,你P里面字符串长度为1,当然输出为一个字符啦。而且你先做还是可见字符,如果是不可见字符,你这时候什么也看不到。 还是把所有字符都转换为十六进制代码,然后再输出吧。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧