mscomm控件接收数据问题

没事就来看看 2012-03-19 03:23:37
请高手指点,MSCOMM控件中的OnComm()响应函数代码如下

void CMscommLianxiDlg::OnComm()
{
// TODO: Add your control notification handler code here
// AnsiString tStr;
VARIANT variant_inp;//和OleVariant用法一样
COleSafeArray safearray_inp;

/* COleVariant safearray_inp;*/
LONG len,k;
BYTE rxdata[2048];//设置BYTE数组 An 8-bit integer that 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); //更新编辑框内容
}

上面这些代码是可以一次接收很多数据,我现在在这个函数里想要实现的是我每次只接收一个字节的数(因为下位机所发的数据是一个字节一个字节的)并且把这个字节的数转化为十进制的整数。能力有限改了这里东西好多次不能实现,请高手帮忙吧 谢谢 !
...全文
140 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdg3707 2012-03-20
  • 打赏
  • 举报
回复
你可以不用在OnComm里接收,因为你是应答式通信,你可以做一个函数里进行收发,你这么试试:
void WR_Fun()
{
AnsiString tStr;
VARIANT variant_inp;//和OleVariant用法一样
COleSafeArray safearray_inp;

/* COleVariant safearray_inp;*/
LONG len,k;
BYTE rxdata[2048];//设置BYTE数组 An 8-bit integer that is not signed.
CString strtemp;
// if(m_ctrlComm.GetCommEvent()==2) //去掉这句,因为是在自己定义的函数
{
////////以下你可以根据自己的通信协议加入处理代码
for(收发次数)
{
1.发送应答帧,具体语句你自己写,我忘了.
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; //加入接收编辑框对应字符串
}

}
}//收发次数循环结束
}
我没调过这个代码,你可以试试,只是在MSComm32这个控件初始化时,要把接收一个字符就响应中断改成0,这样就不会一字符就响应OnComm这个函数了
没事就来看看 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hdg3707 的回复:]
.如果在这里不能发送,就在这个循环外给一个全局变量设标志位,在OnComm函数外面发送应答帧.
[/Quote]
在OnComm函数里面接收完后让其在外面发应答,怎么发啊?不好意思 有点不明白!
LZNJ06 2012-03-20
  • 打赏
  • 举报
回复
给你推荐一下类 CSerialPort 这个类使用,容易控制。好用。
hdg3707 2012-03-19
  • 打赏
  • 举报
回复
明白了,是应答通信方式,上面的代码肯定是只能收一个字节.你基本不需要改,因为取得len肯定是1.在转换成十进制后就用这个控件发送应答帧就行了.具体这个控件的发送代码,网上有现成的,你可能也有了.
在for(k=0;k<len;k++)这个循环退出后面加发送应答帧.如果在这里不能发送,就在这个循环外给一个全局变量设标志位,在OnComm函数外面发送应答帧.
向立天 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ganggangban 的回复:]

引用 1 楼 xianglitian 的回复:
你可以以一次性把数据读进来然后再一个一个改
否则一个一个读太影响效率了
这个问题属于通信协议的范畴

你好 师兄这个不能一次性读因为下位机写的已经固定了就是一个字节的一个字节的发,当我上位机收到一个字节后要给下位机发送一个指令,只有下位机收到这个指令后接着发送下一个字节自己给上位机。所以我这要一个只接受一个字节的代码。师兄你看该怎么写呢?……
[/Quote]
如果有时间间隔不应该粘连啊
没事就来看看 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xianglitian 的回复:]
你可以以一次性把数据读进来然后再一个一个改
否则一个一个读太影响效率了
这个问题属于通信协议的范畴
[/Quote]
你好 师兄这个不能一次性读因为下位机写的已经固定了就是一个字节的一个字节的发,当我上位机收到一个字节后要给下位机发送一个指令,只有下位机收到这个指令后接着发送下一个字节自己给上位机。所以我这要一个只接受一个字节的代码。师兄你看该怎么写呢?
向立天 2012-03-19
  • 打赏
  • 举报
回复
你可以以一次性把数据读进来然后再一个一个改
否则一个一个读太影响效率了
这个问题属于通信协议的范畴

15,980

社区成员

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

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