在VC++6.0 VS2010 VS2012中利用MSCOMM控件开发串口通信软件遇到了棘手的问题

时间:2022-09-06 10:31:51
在网上、课本上关于串口接收程序都是如下面的这些程序:
COleVariant myVar;
VARIANT variant_inp;
COleSafeArray safearray_inp;
BYTE rxdata[8192];    //设置BYTE数组,大小与接收缓冲区一致
long RX_count = 0;    //定义接收计数器为一全局变量
CString strtemp;

void CSCOMMTang1Dlg::OncommMscomm1()
{
// TODO: 在此处添加消息处理程序代码
LONG len,k;
codeNM = m_ctrlComm.get_CommEvent();     //获得事件码
if(codeNM == 2)   //事件码甄别,事件码为2,表示接收到数据,缓冲区//内有数据,进入处理
{
//问题应该就出在这一句上了,有了这一句好像后面的什么没有执行了
myVar.Attach(m_ctrlComm.get_Input());   //读取接收数据
//这里使用Attch是为了解决内存使用渐渐增加的问题
safearray_inp = myVar;
len = safearray_inp.GetOneDimSize();   //得到有效数据长度
strtemp.Format(_T("%ld"),RX_count += len);  //接受字节数累计
strtemp = _T("RX:")+strtemp;
m_ctrlRXCount.SetWindowText(strtemp);//显示接收数据累计字节数
for(k=0; k<len; k++)
safearray_inp.GetElement(&k,rxdata+k);   //转换为BYTE型
//接下来是数据处理
m_ctrlReceiveData.SetWindowTextW(m_strReceiveData);   //显示数据
但是在运行时发现没有数据的显示,如下图:
  在VC++6.0 VS2010 VS2012中利用MSCOMM控件开发串口通信软件遇到了棘手的问题
接收区:
  在VC++6.0 VS2010 VS2012中利用MSCOMM控件开发串口通信软件遇到了棘手的问题
没有任何数据的显示。
下面是自己做的一个测试,就是在读取数据之前加上一个状态显示,代码如下:
strtemp.Format(_T("读取前"));
m_ctrlPortStatus.SetWindowText(strtemp);
//问题应该就出在这一句上了,有了这一句好像后面的什么没有执行了
myVar.Attach(m_ctrlComm.get_Input());   //读取接收数据
运行的结果如下:
  在VC++6.0 VS2010 VS2012中利用MSCOMM控件开发串口通信软件遇到了棘手的问题
接收区没有数据显示:
在VC++6.0 VS2010 VS2012中利用MSCOMM控件开发串口通信软件遇到了棘手的问题
但是看到了自己加进去的状态标志“读取前”,如果将代码写在GetInput之后,就没有这个状态标志了,代码如下:
//问题应该就出在这一句上了,有了这一句好像后面的什么没有执行了
myVar.Attach(m_ctrlComm.get_Input());   //读取接收数据
strtemp.Format(_T("读取前"));
m_ctrlPortStatus.SetWindowText(strtemp);
运行后,没有这个状态标志了。
  在VC++6.0 VS2010 VS2012中利用MSCOMM控件开发串口通信软件遇到了棘手的问题
没有标志了。
  在VC++6.0 VS2010 VS2012中利用MSCOMM控件开发串口通信软件遇到了棘手的问题
这个问题应该是出在读取函数:myVar.Attach(m_ctrlComm.get_Input())这里,就像注释一样,感觉一运行这个函数就什么都没有了,后面的操作全部白费了。这个问题困扰我多多时了,求各位大神们解决啊,谢谢了!!!!

8 个解决方案

#1


菜鸟飘过,据说:串口通信的问题与操作系统有关,xp比较标准,网上的代码在xp上运行良好!
codeNM == 2,你是否试过将这个变量的值改为其他?也可以运行?
codeNM的值是多少表示接收到多少字符就响应该函数!codeNM == 2,(一接收到两个字符就响应函数)说不定这个函数就运行了好几次呢!
我学机电,之前做过这个,也就理解到这个份上了! 在VC++6.0 VS2010 VS2012中利用MSCOMM控件开发串口通信软件遇到了棘手的问题

#2


我已经对codeNM测试过了的。这个codeNM是时间甄别码,等于2的时候表示缓冲区接收到数据,我测试到等于2的时候确实是有反应的,就是感觉那个函数myVar.Attach(m_ctrlComm.get_Input())出问题的,不知道为什么一使用这个之后,后面的所有的处理都不会执行了,很纳闷,如果有执行那就应该会显示接收的字节数的,可是就是没有显示。

#3


我也遇到了相同问题, 用的是以前的vc6.0编写的串口源程序,使用vs2012进行编译运行逐步跟踪貌似就是这句话除了问题,我的系统是win8的,初步猜测应该是win8系统中的某个系统文件跟以前的不同了,vc6中添加的cmscomm跟vs2012种的串口类名函数名都不一样了,

#4


引用 2 楼 ipad_li 的回复:
我已经对codeNM测试过了的。这个codeNM是时间甄别码,等于2的时候表示缓冲区接收到数据,我测试到等于2的时候确实是有反应的,就是感觉那个函数myVar.Attach(m_ctrlComm.get_Input())出问题的,不知道为什么一使用这个之后,后面的所有的处理都不会执行了,很纳闷,如果有执行那就应该会显示接收的字节数的,可是就是没有显示。
请问一下,你的问题解决了吗?我也遇到了同样的问题

#5


引用 3 楼 bnnkyw 的回复:
我也遇到了相同问题, 用的是以前的vc6.0编写的串口源程序,使用vs2012进行编译运行逐步跟踪貌似就是这句话除了问题,我的系统是win8的,初步猜测应该是win8系统中的某个系统文件跟以前的不同了,vc6中添加的cmscomm跟vs2012种的串口类名函数名都不一样了,
你的呢?最终解决了吗?

#6


遇到相同的问题,麻烦大神指导

#7


直接使用windows API去编吧
熟悉了再去用控件会好很多

#8


没用过这个,使用API可能来得更快一些,建议直接使用API

#1


菜鸟飘过,据说:串口通信的问题与操作系统有关,xp比较标准,网上的代码在xp上运行良好!
codeNM == 2,你是否试过将这个变量的值改为其他?也可以运行?
codeNM的值是多少表示接收到多少字符就响应该函数!codeNM == 2,(一接收到两个字符就响应函数)说不定这个函数就运行了好几次呢!
我学机电,之前做过这个,也就理解到这个份上了! 在VC++6.0 VS2010 VS2012中利用MSCOMM控件开发串口通信软件遇到了棘手的问题

#2


我已经对codeNM测试过了的。这个codeNM是时间甄别码,等于2的时候表示缓冲区接收到数据,我测试到等于2的时候确实是有反应的,就是感觉那个函数myVar.Attach(m_ctrlComm.get_Input())出问题的,不知道为什么一使用这个之后,后面的所有的处理都不会执行了,很纳闷,如果有执行那就应该会显示接收的字节数的,可是就是没有显示。

#3


我也遇到了相同问题, 用的是以前的vc6.0编写的串口源程序,使用vs2012进行编译运行逐步跟踪貌似就是这句话除了问题,我的系统是win8的,初步猜测应该是win8系统中的某个系统文件跟以前的不同了,vc6中添加的cmscomm跟vs2012种的串口类名函数名都不一样了,

#4


引用 2 楼 ipad_li 的回复:
我已经对codeNM测试过了的。这个codeNM是时间甄别码,等于2的时候表示缓冲区接收到数据,我测试到等于2的时候确实是有反应的,就是感觉那个函数myVar.Attach(m_ctrlComm.get_Input())出问题的,不知道为什么一使用这个之后,后面的所有的处理都不会执行了,很纳闷,如果有执行那就应该会显示接收的字节数的,可是就是没有显示。
请问一下,你的问题解决了吗?我也遇到了同样的问题

#5


引用 3 楼 bnnkyw 的回复:
我也遇到了相同问题, 用的是以前的vc6.0编写的串口源程序,使用vs2012进行编译运行逐步跟踪貌似就是这句话除了问题,我的系统是win8的,初步猜测应该是win8系统中的某个系统文件跟以前的不同了,vc6中添加的cmscomm跟vs2012种的串口类名函数名都不一样了,
你的呢?最终解决了吗?

#6


遇到相同的问题,麻烦大神指导

#7


直接使用windows API去编吧
熟悉了再去用控件会好很多

#8


没用过这个,使用API可能来得更快一些,建议直接使用API