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这里也执行了,可是就是读不到反馈的数据,补充下,好像和电脑有关,有的可以读到有的读不到,程序的健壮性比较郁闷,但是读不到电脑上的用串口调试助手又是正常能收发读取数据 展开
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这里也执行了,可是就是读不到反馈的数据,补充下,好像和电脑有关,有的可以读到有的读不到,程序的健壮性比较郁闷,但是读不到电脑上的用串口调试助手又是正常能收发读取数据 展开
3个回答
展开全部
建议用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());
}
/* *
** 打开端口名称
** */
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());
}
展开全部
这不是 龚建伟 的 程序段 嘛?
没有问题吧?
仔细 查查 程序输入 是否有误!
祝你顺利
没有问题吧?
仔细 查查 程序输入 是否有误!
祝你顺利
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
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); //更新编辑框内容
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); //更新编辑框内容
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询