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); //显示数据
但是在运行时发现没有数据的显示,如下图:
接收区:
没有任何数据的显示。
下面是自己做的一个测试,就是在读取数据之前加上一个状态显示,代码如下:
strtemp.Format(_T("读取前"));
m_ctrlPortStatus.SetWindowText(strtemp);
//问题应该就出在这一句上了,有了这一句好像后面的什么没有执行了
myVar.Attach(m_ctrlComm.get_Input()); //读取接收数据
运行的结果如下:
接收区没有数据显示:
但是看到了自己加进去的状态标志“读取前”,如果将代码写在GetInput之后,就没有这个状态标志了,代码如下:
//问题应该就出在这一句上了,有了这一句好像后面的什么没有执行了
myVar.Attach(m_ctrlComm.get_Input()); //读取接收数据
strtemp.Format(_T("读取前"));
m_ctrlPortStatus.SetWindowText(strtemp);
运行后,没有这个状态标志了。
没有标志了。
这个问题应该是出在读取函数:myVar.Attach(m_ctrlComm.get_Input())这里,就像注释一样,感觉一运行这个函数就什么都没有了,后面的操作全部白费了。这个问题困扰我多多时了,求各位大神们解决啊,谢谢了!!!!
8 个解决方案
#1
菜鸟飘过,据说:串口通信的问题与操作系统有关,xp比较标准,网上的代码在xp上运行良好!
codeNM == 2,你是否试过将这个变量的值改为其他?也可以运行?
codeNM的值是多少表示接收到多少字符就响应该函数!codeNM == 2,(一接收到两个字符就响应函数)说不定这个函数就运行了好几次呢!
我学机电,之前做过这个,也就理解到这个份上了!
codeNM == 2,你是否试过将这个变量的值改为其他?也可以运行?
codeNM的值是多少表示接收到多少字符就响应该函数!codeNM == 2,(一接收到两个字符就响应函数)说不定这个函数就运行了好几次呢!
我学机电,之前做过这个,也就理解到这个份上了!
#2
我已经对codeNM测试过了的。这个codeNM是时间甄别码,等于2的时候表示缓冲区接收到数据,我测试到等于2的时候确实是有反应的,就是感觉那个函数myVar.Attach(m_ctrlComm.get_Input())出问题的,不知道为什么一使用这个之后,后面的所有的处理都不会执行了,很纳闷,如果有执行那就应该会显示接收的字节数的,可是就是没有显示。
#3
我也遇到了相同问题, 用的是以前的vc6.0编写的串口源程序,使用vs2012进行编译运行逐步跟踪貌似就是这句话除了问题,我的系统是win8的,初步猜测应该是win8系统中的某个系统文件跟以前的不同了,vc6中添加的cmscomm跟vs2012种的串口类名函数名都不一样了,
#4
请问一下,你的问题解决了吗?我也遇到了同样的问题
#5
你的呢?最终解决了吗?
#6
遇到相同的问题,麻烦大神指导
#7
直接使用windows API去编吧
熟悉了再去用控件会好很多
熟悉了再去用控件会好很多
#8
没用过这个,使用API可能来得更快一些,建议直接使用API
#1
菜鸟飘过,据说:串口通信的问题与操作系统有关,xp比较标准,网上的代码在xp上运行良好!
codeNM == 2,你是否试过将这个变量的值改为其他?也可以运行?
codeNM的值是多少表示接收到多少字符就响应该函数!codeNM == 2,(一接收到两个字符就响应函数)说不定这个函数就运行了好几次呢!
我学机电,之前做过这个,也就理解到这个份上了!
codeNM == 2,你是否试过将这个变量的值改为其他?也可以运行?
codeNM的值是多少表示接收到多少字符就响应该函数!codeNM == 2,(一接收到两个字符就响应函数)说不定这个函数就运行了好几次呢!
我学机电,之前做过这个,也就理解到这个份上了!
#2
我已经对codeNM测试过了的。这个codeNM是时间甄别码,等于2的时候表示缓冲区接收到数据,我测试到等于2的时候确实是有反应的,就是感觉那个函数myVar.Attach(m_ctrlComm.get_Input())出问题的,不知道为什么一使用这个之后,后面的所有的处理都不会执行了,很纳闷,如果有执行那就应该会显示接收的字节数的,可是就是没有显示。
#3
我也遇到了相同问题, 用的是以前的vc6.0编写的串口源程序,使用vs2012进行编译运行逐步跟踪貌似就是这句话除了问题,我的系统是win8的,初步猜测应该是win8系统中的某个系统文件跟以前的不同了,vc6中添加的cmscomm跟vs2012种的串口类名函数名都不一样了,
#4
请问一下,你的问题解决了吗?我也遇到了同样的问题
#5
你的呢?最终解决了吗?
#6
遇到相同的问题,麻烦大神指导
#7
直接使用windows API去编吧
熟悉了再去用控件会好很多
熟悉了再去用控件会好很多
#8
没用过这个,使用API可能来得更快一些,建议直接使用API