注册 登录
编程论坛 C++ Builder

求助!关于MSCOMM串口数据发送问题!请帮忙指点一下!!

beigong 发布于 2007-11-22 08:46, 2590 次点击
小弟最近在做一个RS232与单片机通信的东西,用的是VC的MSCOMM控件,现在程序可以成功的接受数据,并按照我所需要的方式显示输出,可我的应答怎么也发送不出去,现将我的编程过程简要表达一下,请大家指点!谢谢各位了!另,我的接收数据部分代码调试通过,想用而没有用过MSCOMM控件的新手朋友可以参考下。
  我是这样做的:
1建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序。
2在项目中插入MSComm控件   选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项,添加Microsoft Communications Control, version 6.0。
3将电话图标拖入对话框中。
4利用ClassWizard定义CMSComm类控制对象,ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm。
5加入编辑对话框并按上步为对话框IDC添加控制变量。
6我在ClassWizard->Message Maps中选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm(为了好记)。
7设置串口参数:主对话框的CSCommTestDlg::OnInitDialog()函数中我串口参数设置如下:
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);

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

m_ctrlComm.SetSettings("2400,n,8,1"); //波特率2400,无校验,8个数据位,1个停止位

m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
m_ctrlComm.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据

8 在OnComm()函数中加入代码,实现自己想要的功能。
void CSCommTestDlg::OnComm()
{
    // TODO: Add your control notification handler code here
    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG len,k;
    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat 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型变量
         {                                     /////////////加入了发送代码
            for(k=0;k<100;k++)
           { strtemp.Format("%d",rxdata[k]); //将字符送入临时变量strtemp存放
            m_strRXData+=strtemp; //加入接收编辑框对应字符串
                  if(rxdata[k]==0xcc) break;}
        }
    }
    UpdateData(FALSE); //更新编辑框内容
}

以上是我编辑调试通过的内容,当我加入数据应答代码时要不下位单片机没有收到数据,要不执行程序没了响应。
我在上面说明的位置加入代码如下:
     {        CByteArray       array;                              
  
  array.SetSize(sizeof(TxData));     
                                                   //TxData为应答数据所在数组,我试过定义成INT或BYTE型都不行
  for(int   i=0;i<SIZEOF(TXDATA);I++)? ???
   array.SetAt(i,   TxData);   
  m_ctrlComm.SetOutput(COleVariant(array));     }

或:
CByteArray       array;                              
array.SetSize(6);   

array[0]       =       0xaa;   
array[1]       =       0x03;   

array[2]       =       0x01;   
array[3]       =       0x01;   

array[4]       =       0x05;   
array[5]       =       0xcc;   


m_ComPort.SetOutput(COleVariant(array));

调试时可以看到数组值正确,但COleVariant(array)的值是一串16进制代码,不懂了就。
希望一起交流,并得到各位帮忙指点,在下感激不尽!!!!!
2 回复
#2
beigong2007-12-20 11:23
发送问题解决了
   {        CByteArray       array;                              
  
  array.SetSize(); //括号内为要发送数组的长度   
                                                   //TxData为应答数据所在数组,我试过定义成INT或BYTE型都不行
  for(int   i=0;i<;I++)   //   i小于内为要发送数组的长度,即有多少个数字循环几次      
   array.SetAt(i,   TxData[i]);   
  m_ctrlComm.SetOutput(COleVariant(array));     }

   希望这些东西对要用MSCOMM控件的朋友有所帮助!
 另MFC对话框显示中怎么换行啊,我现在在“”中加空格,也太笨了,哪位告诉我一下,呵呵!
#3
hohofaint2010-03-04 16:52
太感谢你了,你说的对我的学习很有帮助。
1