有关串口通信的简单问题.

zhuanqiao 2006-04-13 09:52:43
我现在要用Comm控件实现串口通信,一个命令帧发下去之后会有36个字节的数据传上来.
我看见好像void CMzmDlg::OnOnCommMscomm1() 这个函数反应了好几次,我的Com控件的设置是:

m_nPort=1;
m_strSettings=_T("4800,n,8,1");
m_strSendString=_T("");

////////////////////////////////////////////////////////

if(m_Com.GetPortOpen())
m_Com.SetPortOpen(FALSE);

m_Com.SetCommPort(m_nPort); //选择com1
if( !m_Com.GetPortOpen())
m_Com.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");

m_Com.SetSettings(m_strSettings); //波特率4800,无校验,8个数据位,1个停止位
m_Com.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_Com.SetInputMode(1);
m_Com.SetInputLen(0); //设置当前接收区数据长度为0
m_Com.GetInput();//先预读缓冲区以清除残留数据

我想等到36个字节的时候才触发这个函数,应该如何设置的啊?
谢谢.

此外一个很郁闷的问题就是我的Edit框在闪了几下之后就变成0了.很明显的是OnOnCommMscomm1()这个函数响应过了,但是结果始终是0,好郁闷.OnOnCommMscomm1()代码如下:
void CMzmDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here

//////////////////////////
//MessageBox("OK");
/////////////////////////

VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;

long temp;

if(m_Com.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp = m_Com.GetInput(); //读缓冲区
safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组

}

temp=rxdata[0]*256+rxdata[1];
temp=temp*256+rxdata[2];
temp=temp*256+rxdata[3];
m_UOrigin=temp;


UpdateData(FALSE); //更新编辑框内容




}

这里的m_UOrigin就是对应了一个Edit框,用于显示结果的.

谢谢谢谢
...全文
113 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
一条晚起的虫 2006-04-14
  • 打赏
  • 举报
回复
oldData并不是malloc出来的,不能用free(),倒是m_pData用完后用free()释放。
zhuanqiao 2006-04-13
  • 打赏
  • 举报
回复
谢谢谢谢.
但是现在有一个很郁闷的问题,就是我现在有一个rxdata的BYTE型的数组,是存放每次从串口读上来的值,每次读完之后我都会将rxdata里面的值传给以LPBYTE型指针m_pData指向的存储区.这个是通过函数AppendData(LPBYTE p, int addlen)来完成的.
我感觉也不是十分难的,但是老是出错:
OnOnCommMscomm1()里面的代码是:
if(m_Com.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp = m_Com.GetInput(); //读缓冲区
safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
AppendData(rxdata,len);


}
if(m_length==36)
......

这里AppendData函数的代码为:

void CMzmDlg::AppendData(LPBYTE p, int addlen)
{

int i;
LPBYTE oldData=m_pData;
int oldlen=m_length;
m_pData = (LPBYTE) malloc(oldlen+addlen);
m_length = oldlen+addlen;

// memcpy(m_pData, oldData, oldlen);
// free(oldData);
// memcpy(m_pData+oldlen,p,addlen);


for(i=0;i<oldlen;i++)
m_pData[i]=oldData[i];
for(i=oldlen;i<m_length;i++)
m_pData[i]=p[i-oldlen];
free(oldData);

}

我不知道哪里出错了,每次编译都没有问题,只是运行的时候会报:debug Asserration Failed.
file:dbgheap.c Line1011等等.

我用debug跟进去看,发现是在free(oldData)的时候会报这个错误.
不知道为什么会这样啊?
一条晚起的虫 2006-04-13
  • 打赏
  • 举报
回复
1、m_Com.SetRThreshold(36); 36个字符到达输入缓冲区后触发OnComm事件;
2、m_UOrigin += temp; 多触发几次也不会冲掉了。

在m_Com.SetRThreshold(1)时,一般在收走8个字符后,就会OnComm一次,什么原因不清楚

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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