我最近刚开始做串口编程的工作,VC++ + MSComm控件实现。我参考的是
http://www.gjwtech.com/vcandc/scommassistantcode.htm 龚建伟老师的介绍。
我的问题很让我迷惑不解,郁闷死了,没法交差啊!!希望各位长者经常来我
这个帖子里看看,因为我不能一下表达清楚我的错误。各位慢慢就会发现错误的
地方,所以请大家以后继续关注我的问题好吗?先谢谢啊!!
部分代码如下:
void CCOMTestDlg::OnOnCommMscomm1()
{
if(this->m_ctrlComm.GetCommEvent()==2)
{
VARIANT vResponse;
k=this->m_ctrlComm.GetInBufferCount();//k是CCOMTestDlg的变量存放接收到的字节数
if(k>0)
{
vResponse=m_ctrlComm.GetInput();
char * str;
str=(char *)(BYTE*)vResponse.parray->pvData;
rxdata=new BYTE[k];//rxdata是CCOMTestDlg类的变量接收到的字符存入rxdata
memset(rxdata,0,k);
for(int i=0;i<k;i++)
rxdata[i]=(BYTE)(*(str+i));
this->xianshi(rxdata,k,this->m_strRXData);//自定义函数,将接收到的字符显示到接收编辑框, m_strRXData是接收框的变量
}
}
this->UpdateData(false);
}void CCOMTestDlg::xianshi(BYTE *data, int len, CString &str)//自定义函数
{
CString strtemp;
for(int k=0;k<len;k++)
{
BYTE bt=*(data+k);
strtemp.Format("%c",bt);
str+=strtemp;
}
}
运行结果是对的,可问题是如果我把OnOnCommMscomm1()函数中加AfxMessageBox("aaa")
当发送的数据比较多时,AfxMessageBox("aaa")被调用多次,也就是OnOnCommMscomm1()
会被执行多次,为什么啊?
对此我很迷惑,在我后续的工作当中出现了很多麻烦我认为和我对串口触发事件了解不透彻
有关系,请各位长者指点啊!!!!
有人愿意听我慢慢的把问题道来吗??
http://www.gjwtech.com/vcandc/scommassistantcode.htm 龚建伟老师的介绍。
我的问题很让我迷惑不解,郁闷死了,没法交差啊!!希望各位长者经常来我
这个帖子里看看,因为我不能一下表达清楚我的错误。各位慢慢就会发现错误的
地方,所以请大家以后继续关注我的问题好吗?先谢谢啊!!
部分代码如下:
void CCOMTestDlg::OnOnCommMscomm1()
{
if(this->m_ctrlComm.GetCommEvent()==2)
{
VARIANT vResponse;
k=this->m_ctrlComm.GetInBufferCount();//k是CCOMTestDlg的变量存放接收到的字节数
if(k>0)
{
vResponse=m_ctrlComm.GetInput();
char * str;
str=(char *)(BYTE*)vResponse.parray->pvData;
rxdata=new BYTE[k];//rxdata是CCOMTestDlg类的变量接收到的字符存入rxdata
memset(rxdata,0,k);
for(int i=0;i<k;i++)
rxdata[i]=(BYTE)(*(str+i));
this->xianshi(rxdata,k,this->m_strRXData);//自定义函数,将接收到的字符显示到接收编辑框, m_strRXData是接收框的变量
}
}
this->UpdateData(false);
}void CCOMTestDlg::xianshi(BYTE *data, int len, CString &str)//自定义函数
{
CString strtemp;
for(int k=0;k<len;k++)
{
BYTE bt=*(data+k);
strtemp.Format("%c",bt);
str+=strtemp;
}
}
运行结果是对的,可问题是如果我把OnOnCommMscomm1()函数中加AfxMessageBox("aaa")
当发送的数据比较多时,AfxMessageBox("aaa")被调用多次,也就是OnOnCommMscomm1()
会被执行多次,为什么啊?
对此我很迷惑,在我后续的工作当中出现了很多麻烦我认为和我对串口触发事件了解不透彻
有关系,请各位长者指点啊!!!!
有人愿意听我慢慢的把问题道来吗??
解决方案 »
- winsock里的recv默认是非阻塞?
- 关于C#窗口控制权的问题
- SDI中formView的切换时,FormView无法create
- 谁能提供车牌识别系统源代码!!!急。。。。。。。。
- 怎么将菜单禁用后变亮
- 大家谁对IE的Index.dat的文件格式有研究,请指点一下
- 我想要供学习用的vc++文档代码资料,能不能给我推荐一些精典的啊,万分感谢!
- 上哪去下载sniffer?
- mfc 中使用Tinyxml出现问题。。。
- 为什么这样给ListBox添加消息就不行????
- Socket瞬断时间设置,100分
- 在CListView中的CListCtrl中的某列动态创建一个具有CBS_DROPDOWN风格的CComboBox为什么失败,反而创建CBS_DROPDOWNLIST的却能够实现。
先说问题,
1。这里的rxdata每次都new,却没看到释放,很明显有内存泄漏,建议做成大的数组,也就是接收缓冲区了
2。从SAFEARRAY中读数组,最好用它的AccessData,不要直接用parray,如下: UCHAR* p = NULL;
int nlen = v.GetOneDimSize();
v.AccessData((void**)&p);
memcpy(rxdata, p, nlen);
v.UnaccessData();
3。 你收到的数据既然是字符串,为什么你用二进制模式接收,而不用字符串模式接收,可以用
SetInputMode(0)设置为字符串模式,就没这么麻烦了吧
4。为什么要把xiaoshi放在其它地方,当你点你的按钮时,你怎么知道你是不是漏过了几次OnComm事件,也就丢掉了几趟rxdata数据了