MScomm控件VC接收数据问题,急!!!!!!!!!!!!

VARIANTvariant_inp;COleSafeArraysafearray_inp;LONGlen,k;BYTErxdata[2048];//设置BYTE数组An... VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp,strtemphex;
if(m_CMSCommJG.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_CMSCommJG.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存放
strcom2+=strtemp; //加入接收编辑框对应字符串
BYTE bthex=*(char*)(rxdata+k); //字符型
strtemphex.Format("%02X ",bthex); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
strcom2hex+=strtemphex;
}
}

OnComm事件的过程代码,能相应OnComm事件,但是
variant_inp=m_CMSCommJG.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
这里的variant_inp safearray_inp 调试的时候得到的结果都是{???}len得到的长度都是0,偶尔出现过能正常显示的状态,请问是否有高手能帮我解决这个问题,QQ:309727874,在线急盼.......
输入输出都没错,用串口监控软件也能读到数据,而且m_CMSCommJG.GetCommEvent()==2这里也执行了,可是就是读不到反馈的数据,补充下,好像和电脑有关,有的可以读到有的读不到,程序的健壮性比较郁闷,但是读不到电脑上的用串口调试助手又是正常能收发读取数据
展开
 我来答
rabbit5455
2009-07-25 · 超过51用户采纳过TA的回答
知道小有建树答主
回答量:93
采纳率:0%
帮助的人:138万
展开全部
建议用API来写串口通讯,没有这么多麻烦事儿

/* *
** 打开端口名称
** */
string it_comm("\\\\.\\");

try
{
it_comm.append("COM1");
hCom = CreateFile(it_comm.c_str()
, GENERIC_READ | GENERIC_WRITE
, 0
, NULL
, OPEN_EXISTING
, 0
, NULL
);

if (hCom == INVALID_HANDLE_VALUE)
{
throw bad_exception((it_comm + ":打开串口失败").c_str());
}

//设置波特率、校验位等
commcfg.dcb.BaudRate = uiBaudRate;
commcfg.dcb.ByteSize = 8;
commcfg.dcb.Parity = NOPARITY;
commcfg.dcb.StopBits = ONESTOPBIT;
commcfg.dcb.fBinary = TRUE;

commcfg.dcb.fDtrControl = DTR_CONTROL_DISABLE;
commcfg.dcb.fRtsControl = DTR_CONTROL_DISABLE;

//CommConfigDialog(it_comm->c_str(), NULL, &commcfg);

/* *
* 应用新的串口配置
*/
fSucc = SetCommConfig(hCom, &commcfg, (DWORD)sizeof(commcfg));

/* *
* 发送数据
*/
fSucc = WriteFile(hCom
, buf
, (DWORD)buf_length
, &lenw
, NULL
);
if (!fSucc)
{
throw bad_exception((szCommPortName + ":发送失败").c_str());
}

/* *
* 读取数据
*/
fSucc = ReadFile(hCom
, buf
, (DWORD)buf_length
, &lenr
, NULL
);
if (!fSucc)
{
throw bad_exception((szCommPortName + ":读取失败").c_str());
}
萍水e相逢
2009-07-25 · TA获得超过3万个赞
知道大有可为答主
回答量:5.9万
采纳率:46%
帮助的人:1.4亿
展开全部
这不是 龚建伟 的 程序段 嘛?

没有问题吧?

仔细 查查 程序输入 是否有误!

祝你顺利
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2009-07-28
展开全部
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[100]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;

if(m_comm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp = m_comm.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=*(BYTE*)(rxdata+k); //字符型

strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

m_strReceive += strtemp; //加入接收编辑框对应字符串
}
m_strReceive += "\r\n";
}
m_num=rxdata[0];
UpdateData(FALSE); //更新编辑框内容
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式