vc中MSCOMM与单片机通讯问题,望高手帮帮忙

advanceaa2 2010-05-03 06:52:49
串口配置:
if(m_ctrlComm.GetPortOpen()) //如果串口是打开的,则行关闭串口
{
m_ctrlComm.SetPortOpen(FALSE);
}
m_ctrlComm.SetCommPort(1); //选择COM1
m_ctrlComm.SetInBufferSize(1024); //接收缓冲区
m_ctrlComm.SetOutBufferSize(1024);//发送缓冲区
m_ctrlComm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_ctrlComm.SetInputMode(1);//以二进制方式读写数据
m_ctrlComm.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_ctrlComm.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位
if(!m_ctrlComm.GetPortOpen())//如果串口没有打开则打开
m_ctrlComm.SetPortOpen(TRUE);//打开串口

void CMSCDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
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_ctrlHexDisplay.GetCheck())
strtemp.Format("%02d ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
///

CString str2;
str2.Empty();
m_edlt1=str2;

m_edlt1+=strtemp; //加入接收编辑框对应字符串
}

}


UpdateData(FALSE); //更新编辑框内容
}

遇到的问题:一收数据就产生应用程序错误
“0x5f5624b0”指令引用的"0x0000205d"内存,该内存不能为"read"

...全文
225 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cc023061227 2010-09-14
设置vc的编译环境; 将project 选项下 Settings 的general 选项的Use MFC in a shared DLL 改为Use MFC in a Static Liabary
回复
cc023061227 2010-06-23
请问 你怎么好的啊!
回复
advanceaa2 2010-05-04
[Quote=引用 15 楼 liwei3290 的回复:]
可以联系我 我帮你写 liwei329044941@126.com
[/Quote]
好了 谢谢
回复
advanceaa2 2010-05-04
我在PROJECT->SETTING中用Static Library就可以,用shared DLL就不可以,
是要换MFC的库文件吗?
回复
liwei3290 2010-05-04
可以联系我 我帮你写 liwei329044941@126.com
回复
advanceaa2 2010-05-04
[Quote=引用 13 楼 finder_zhang 的回复:]
楼主,那你原来的电脑,有没有REBUILD一下啊?
[/Quote]
回复
finder_zhang 2010-05-04
楼主,那你原来的电脑,有没有REBUILD一下啊?
回复
advanceaa2 2010-05-04
我换台电脑编译就可以,这是什么问题?
回复
wxxloveu 2010-05-04
具体VC没做过,报内存错误看看是不是哪块指针没处理好哦,PS:用VB就不会出现这样的问题
回复
finder_zhang 2010-05-03
rebuild 有时我也试过,莫名其妙的问题,rebuild 之后又行了.
回复
wade_2003 2010-05-03
我也在做这个,哈哈
好,拷贝你的代码了
回复
finder_zhang 2010-05-03
我也是连单片机,我也是用 MSCOMM ,我的代码跟你的也几乎一样.

我试了一下你的代码,没有问题喔,可以收到的.
你要不要先去掉那些代码试试
strtemp.Format( "%02d ",bt);
CString str2;
str2.Empty();
m_edlt1=str2;
m_edlt1+=strtemp;

直接在output窗上TRACE一下你的数据看看接收正不正确先.
回复
PL23K 2010-05-03
个人觉得用 cncomm 类比较好 你搜一下这个类 传说中的 “中国串口” 哪个牛人写 很好用
回复
向立天 2010-05-03
出错后看一下调用堆栈
定位到具体位置才好分析
回复
advanceaa2 2010-05-03
毕业设计烦恼中,做等有心人帮忙。
回复
bewalking1 2010-05-03
你试试VC的“组建-清除”命令,以前也碰到过类似的问题,程序怎么查都没有错,“组建-清除”后就好了。
回复
Number101 2010-05-03
strtemp.Format( "%02d ",bt);应该改为strtemp.Format("%2X",bt)//将字符以十六进制方式送入临时变量
不影响数据的Read.
回复
advanceaa2 2010-05-03
好 我去看看
回复
尹成 2010-05-03
用 cncomm 类,直接在output窗上TRACE一下你的数据看看接收
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2010-05-03 06:52
社区公告

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