MFC编写的串口通信程序,接收不到数据???

gxxtjy 2013-12-24 08:18:16
最近用基于MSComm控件,用MFC编写了一个串口收发数据的小程序!单片机的程序就是,接收上位机发送的数据,并发回给上位机。串口调试助手测试成功。但是我用自己编的串口界面测试时,发送框的数据可以发送,但是接受框的数据不能显示!下位机单片机的RXD管脚有数据输入,TXD管脚有数据输出,(用示波器测试)。下面是串口响应代码:
void CSCommTestDlg::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); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
}
求高手予以指点,不胜感激!
...全文
1495 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
halswls 2015-06-01
  • 打赏
  • 举报
回复
引用 8 楼 wlwh90 的回复:
我也遇到了这个问题。 最后猿友提供的办法解决了。 办法:添加mscomm控件的事件响应函数,要点右键添加事件handle-->添加响应函数,不要用类向导添加。 附上链接:http://blog.csdn.net/drlsdrls/article/details/11126069
6.0的这些映射的东西都有啊,为什么也无法显示了呢?而且我之前的所有串口程序都没问题,今天突然就不行了,所有的都不行了,但是用serialport测试是可以的
vcf_reader 2015-04-03
  • 打赏
  • 举报
回复
CSerialPort比控件好用
ArthurKingYs 2015-03-21
  • 打赏
  • 举报
回复
中断能进OnComm函数说明有数据 就是接受的问题 不能进就是串口初始化的问题
无无90 2015-03-20
  • 打赏
  • 举报
回复
我也遇到了这个问题。 最后猿友提供的办法解决了。 办法:添加mscomm控件的事件响应函数,要点右键添加事件handle-->添加响应函数,不要用类向导添加。 附上链接:http://blog.csdn.net/drlsdrls/article/details/11126069
jianminfly 2015-01-15
  • 打赏
  • 举报
回复
不好意思挖坟了,但大事是可以掘坟的我想请问一下楼主,您的str是CString类型的么?然后强制转换为(char*)类型,最后和LONG类型的i相加,您的(char*)能和LONG相加么?
hdg3707 2013-12-25
  • 打赏
  • 举报
回复
你先设断点看看控件里有没有数据,数据是否正确,别是显示控件的问题。另外,你初始化串口控件时设成来一个数据就中断
赵4老师 2013-12-25
  • 打赏
  • 举报
回复
推荐使用portmon软件辅助调试串口通信程序。
gxxtjy 2013-12-25
  • 打赏
  • 举报
回复
引用 4 楼 zhuyf87 的回复:
会不会是这的问题:variant_inp = m_ctrlComm.GetInput(); //读缓冲区
我把好几年前代码翻出来了,当时肯定是能用的,你对照一下。其中MSComm控件的API名字可能与你的不一样,我在是vs2008下用的。
void CDevState::OnCommMscomm()
{
LONG len = 0, k = 0;
COleVariant myVar;
COleSafeArray safearray_inp;
BYTE rxdata[20] = {0};

Switch (comm.get_CommEvent())
{
case 2:
{
myVar.Attach(comm.get_Input());
safearray_inp = myVar;
len = safearray_inp.GetOneDimSize();

for (k = 0; k < len; k++) {
safearray_inp.GetElement(&k, rxdata + k);
}

HandleCommand(rxdata, len);
myVar.Detach();
}
break;
default:
break;
}
}
,恩!我觉得应该不是类型转换的问题,下面是我修改后的程序,可以运行!直接把类型转换换成另一种方式!实在找不出之前的程序哪个地方出问题了???
zhuyf87 2013-12-25
  • 打赏
  • 举报
回复
会不会是这的问题:variant_inp = m_ctrlComm.GetInput(); //读缓冲区 我把好几年前代码翻出来了,当时肯定是能用的,你对照一下。其中MSComm控件的API名字可能与你的不一样,我在是vs2008下用的。
void CDevState::OnCommMscomm()
{
	LONG len = 0, k = 0;
	COleVariant myVar;
	COleSafeArray safearray_inp;
	BYTE rxdata[20] = {0};

	Switch (comm.get_CommEvent())
{
	case 2:
{
		    myVar.Attach(comm.get_Input());
		    safearray_inp = myVar;
		    len = safearray_inp.GetOneDimSize();

		    for (k = 0; k < len; k++) {
			    safearray_inp.GetElement(&k, rxdata + k);
		    }

		    HandleCommand(rxdata, len);
		    myVar.Detach();
        }
		break;
	default:
		break;
	}
}
zhuyf87 2013-12-25
  • 打赏
  • 举报
回复
引用 2 楼 gxxtjy 的回复:
我发现 “safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量”这句出了问题,调试时len=safearray_inp.GetOneDimSize(); //得到有效数据长度,其中len的值为0,数据转化出现了问题,我是参照的龚建伟的代码。不知道是不是这个问题?
应该不是这的问题,这个转换是可以的。龚建伟那段代码我也用过,没问题的。
gxxtjy 2013-12-25
  • 打赏
  • 举报
回复
引用 1 楼 hdg3707 的回复:
你先设断点看看控件里有没有数据,数据是否正确,别是显示控件的问题。另外,你初始化串口控件时设成来一个数据就中断
我发现 “safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量”这句出了问题,调试时len=safearray_inp.GetOneDimSize(); //得到有效数据长度,其中len的值为0,数据转化出现了问题,我是参照的龚建伟的代码。不知道是不是这个问题?

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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