原创 VC++串口通信编程(转载)

2010-6-5 15:03 1797 5 5 分类: 通信
近我的项目的进展有一点的缓慢,这有几个方面的原因:一方面,是因为我们的硬件已经完成了PCB板的设计(这个是硬件小王子侯老师完成的)已经拿去做板子了,现在就等着制板的公司把我们的板子做出来了,最近没有板子,光靠开发板做的程序已经基本不用再调试了,所以最近一直没有再进项目。另一个方面,最近才发现上位机的程序也要靠我们自己来做,所以最近就把Zigbee的东西小放了一下,重新开始用VC++做上位机软件,这次做的软件其他的部分我觉得还是没有什么新鲜的,唯一比较新鲜的就是串口通信的部分,这是我第一次做。刚刚做了一个实验程序,把串口通信这个部分做好了。吼吼~第一次看见自己的CC2430与VC++程序连在一起完成工作还是蛮有成就感的。下面的任务就是怎样把自己的上位机和CC2430连起来了。

   下面就来总结一下刚刚做的这个实验,这个实验恐怕是整个串口通信中最简单的一个了。就是一个收数据,一个接收数据显示(我想了想我的项目也就能用到这么一点的串口通信功能),用的是对话框格式。下面一起来看看吧。


STEP1->


 首先完成的是整程序的布局,整个不用多说了,直接看下面的图大家就明白了。


VC++串口通信编程 - 荒野无灯 - 荒野无灯

STEP2->

  我觉得重要的源程序代码:


(1)BOOL CTryDlg::OnInitDialog()
{
 CDialog::OnInitDialog();
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);


 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }


 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon
 CString str;
 str="阿元串口收发测试程序";
 this->SetWindowText(str);
 m_ctrlComm.SetCommPort(3); //选择COM3
    m_ctrlComm.SetInputMode(1); //输入方式为二进制方式
    m_ctrlComm.SetInBufferSize(1024); //设置输入缓冲区大小
 m_ctrlComm.SetOutBufferSize(512); //设置输出缓冲区大小


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


//参数1表示当串口接收缓冲区中有多于或者等于1个字符时将引发一个接收数据的OnOnCommMscomm1事件
 if(!m_ctrlComm.GetPortOpen())
  m_ctrlComm.SetPortOpen(1);
 m_ctrlComm.SetRThreshold(1);
 m_ctrlComm.SetInputLen(0); //设置当前接受区长度为0
 m_ctrlComm.GetInput(); //先预读缓冲区以清除残留数据


 return TRUE; // return TRUE  unless you set the focus to a control
}


(2)void CTryDlg::OnOnCommMscomm1() //从串口接收数据并显示在接受编辑框中
{
  VARIANT variant_inp;
  COleSafeArray safearray_inp;
  LONG len,k;
  BYTE rxdata[2048];
  CString strtemp;
  if(m_ctrlComm.GetCommEvent() == 2) //如果接收缓冲区内有字符
  {
    variant_inp = m_ctrlComm.GetInput(); //读缓冲区
    safearray_inp = variant_inp;
 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);
  m_strEditRXDATA += strtemp; //加入接受编辑框对应字符
 }
  }
  UpdateData(0);
}


(3)void CTryDlg::OnButtonManualsend()
{
  UpdateData(1); //读取编辑框内容
  m_ctrlComm.SetOutput(COleVariant(m_strEditTXDATA)); //发送数据
}


 


以上就是这个简单程序的主要的源程序代码,他的运行效果见下图(首先要将CC2430打开,板子里面的程序是例子程序的串口测试程序)。


VC++串口通信编程 - 荒野无灯 - 荒野无灯

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条