【VB开源代码栏目提醒】:网学会员在VB开源代码频道为大家收集整理了“串口上位机程序的编制 - 经营企划“提供大家参考,希望对大家有所帮助!
我们飞思卡尔智能车的比赛已经接近尾声了,23 号就要去上海决赛了呵。
论文基本完成,Duuboo 已经排版结束,排出来还真挺长的。
整个过程都挺累的,持续的时间还这么长,最累的恐怕只有惠哥了,这些比赛完再说吧。
这里介绍下在 Donald 写的一个串口调试程序,主要是方便我们查看运行起来的小车的内部参数。
程序的作用是接收来自 Freescale MC9SDG128 单片机发送来的数据,并显示出来。
分为两部分。
一部分是普通的数据,ASCII 数据,另一部分是实时的图像,也是以 ASCII 方式传输。
程序可通过“模式”按钮设置工作在这两种模式。
当进入 CCD 模式时,通过“连接”按钮触发 DG128 单片机发送图像信息,这时“连接”按钮变为“断开”,可通过其触发 DG128 单片机停止发送,降低单片机内部资源消耗。
程序中串口部分的编程参考的是《Visual C串口通信技术与工程实践》,李现勇编著。
书中对串口的编程讲得很不错,除了 C 的,还有
VB 的。
详细请参考该书。
这里介绍本程序的一部分程序
代码。
一、添加串口控件本程序是在 VC6 下 MFC 实现,所以添加一个串口控件,方法是选择 Project 菜单下 Add To Project 子菜单中的 Components and Controls 选项,在弹出的对话框中进入 Registered ActiveX Controls 目录,选择 Microsoft Communications Control version 6.0,,Insert 到 Project 中就行了。
然后可在窗体中添加串口控件,接着 CtrlW 到 ClassWizard 中为该控件添加一个对应的变量就行。
二、串口
工作方式的改变串口的工作方式有很多种,比如串口的选择、波特率、校验位、数据位和停止位等。
这些的设置可以通过组合框实现,实现方法基本一样,Donald 就以波特率说明下。
之前已经为波特率组合框对象 IDC_COMBO_BAUD 添加对应变量 m_cboBaud。
在程序主窗体初始化时写有如下
代码。
// combo Baud init m_cboBaud.AddString_T1200 m_cboBaud.AddString_T2400 m_cboBaud.AddString_T4800 m_cboBaud.AddString_T9600 m_cboBaud.AddString_T115200 m_cboBaud.SetCurSel3 m_strBaud _T9600再在 ClassWizard 中为 IDC_COMBO_BAUD 添加 CBN_SELCHANGE 消息处理函数,再在函数中添加
代码。
switch m_cboBaud.GetCurSel case 0: m_strBaud _T1200 break case 1: m_strBaud _T2400 break case 2: m_strBaud _T4800 break case 3: m_strBaud _T9600 break case 4: m_strBaud _T115200 break default: m_strBaud _T9600 InitCommPort通过 switch 选择不同的波特率。
case 的顺序按照初始化添加时的顺序,开始为0。
三、OnComm消息处理函数在串口控件中,最重要的就是 OnComm函数,这个函数是用来处理串口消息事件的,每当串口接收到数据,就会产生一个串口接收数据缓冲区中“有字符”的消息事件,只要在该函数内写好处理这些字符的
代码就可以。
在 Donald 的这个程序里,该程序
代码如下。
代码的结构(switch 结构)是参考该书。
VARIANT variant_inp COleSafeArray safearray_inp CByteArray arraySend LONG lenk BYTE rxdata1024 //An 8-bit integer that is not signed for Receive CString strAdd int i m_strComRcv.Empty switchm_com.GetCommEventcase 1: // comEvSendarraySend.RemoveAllarraySend.SetSizem_strEditTrn.GetLengthfor i 0 i m_strEditTrn.GetLength i arraySend.SetAti m_strEditTrn.GetAtim_com.SetOutputCOleVariantarraySendbreakcase 2: // comEvReceivevariant_inp m_com.GetInput // Read buffersafearray_inp variant_inp // VARIANT to ColeSafeArraylen safearray_inp.GetOneDimSize // Get effective length// Store to EDIT_REVfork 0 k len k safearray_inp.GetElementk rxdata k // Change to BYTE array BYTE bt charrxdatak // BYTE type strAdd btif m_bCcdMode FALSE m_myEdit.AppendTextstrAdd else g_strRcv strAdd g_bReceive TRUEbreakdefault: // Errorm_com.SetOutBufferCount0//AfxMessageBoxCom Err2009 年 9 月开始,证监会有关部门在房地产企业融资审核之前设了一道程序,即徵求国土部、住建部等主管部门的意见。
证监会对房地产上市公司的再融资申请近期将重启审核,因证监会已与国土资源部达成一致,后者将在返还给证监会的徵求意见回复上,就再融资申请企业是否存在土地违法违规的情况做出具体说明. 报导称,根据新的审核规则,房地产公司权益类再融资,须增加国土资源部对募集资金投资项目所涉用地的审查据前述权威人士透露,2009 年下半年以来,A 股房地产公司向证监会提出的增发申请均未被放行,主要原因就是该国有土地审核。
房地产公司上市已经成为国内资本市场的热门话题。
之所以有这么多房地产公司竟相上市,主要是通过 IP0 上市融资具有很多好处:可以筹集大量资金,缓解资金压力,并形成一个持续再融资平台;可以提高股权的变现能力:可以改善资本结构,促进公司治理结构调整,提高管理水平,降低经营风险;可以增强品牌影响力, 而 促进业务发展。
IP0 上市的主要缺点则是原有股东控制权会被稀释、上市费用高昂等。
2007 年有广宇集团、荣盛发展 2 家房地产开发企业在深圳证券交易所上市,首发募集资金共计 23.73 亿元。
其中,广宇集团募集资金 10.8 亿元,荣盛发展实际募集资金 12.93 亿元。
2008 年有合肥城建、滨江集团 2 家房地产开发企业在深圳证券交易所上市,首发募集资金共计 16.35 亿元。
其中,合肥城建募集资金 4.17 亿元,滨江集团募集资金 12.19 亿元。
2008 年 1 月,合肥城建上市。
合肥城建是一家具有 20 多年房地产开发经验,以普通商品住宅及其配套商业地产、综合商务楼的开发、销售、服务为主营业务,经营稳健、具有成熟盈利模式的专业化、区域性的大型房地产开发公司。
本次发行募集资金将分别用于投资建设世纪阳光花园红阳苑高层项目,拟投入募集资金 4817 万元世纪阳光花园兰阳苑项目,拟投入募集资金 16213 万元琥珀名城一期项目,拟投入募集资金 8970 万元。
滨江集团在深交所上市交易, 2008 年 5 月, 此次上市交易的发行价格为 20.31元,发行市盈率 23.95 倍,上市数量 4800 万股。
杭州滨江房产集团股份有限公司成立于 1996 年,2007 年度商品房销售总额 40.56 亿元,占杭州主城区房产市场份额的 7.66,是杭州地区的龙头地产公司。
公司已连续 3 年成为主城区楼盘销售第一名。
2008 年全国房地产百强企业综合实力排名第 41 名。
滨江集团目前拥有的在建和拟建项目储备面积 230 万平方米其中权益面积 205.45 万平方米,未结算可售面积 172 万平方米权益面积约 150 万平方米。
公司本次募投项目为杭州钱江新城板块的城市之星、阳光海岸以及杭州城西的文教区板块的金色蓝庭三个项目。
这三个项目预计在 2010 年和 2011 年竣工。
2009 年 9 月,世联地产在深交所上市,发行价格 19.68 元,上市数量 3200万股,筹措资金 6.3 亿元。
2009 年 10 月,南国置业在深交所上市,发行价格 12.3 元,发行数量 4800万股,筹资 5.9 亿元。
表1 2003-2009 年内地股市房地产业 IPO 融资情况 单位:家,亿元 2003 2004 2005 2006 2007 2008 2009 家数 0 3 0 2 2 2 3 融资额 0 20.53 0 16.35 23.73 16.35 12.2 数据来源:世经未来整理 (二)香港 IPO 近年来,越来越多的内地房地产企业赴港上市。
从 2005 年下半年开始,已有 18 家内地地产商赴港融资,数量是此前三年的两倍多;总募资金额(含超额配售)高达 854 亿港元,是此前三年的近 10 倍。
2007 年在香港市场的 IPO 融资有:4 月碧桂园香港挂牌上市融资 148 亿港币; 月方兴地产上市; 月远洋地产香港挂牌上市募集 119 亿港币; 月 SOHO 8 9 10中国香港上市募集 100 多亿港币,同月上市的名不见经传的中国奥园也募集到36 亿港币。
内地地产商赴港上市的意愿越来越强烈,这种形势在 2008 年进一步实施货币紧缩政策之后,表现得尤为突出。
2008 年6月6日,建业地产在市况冷淡的情况下坚持上市,虽然首日破发,而且融资规模比预计少了数亿,但其仍对整个IPO 表示满意。
与碧桂园 2007 年上市时的状况大不相同,现在香港投资者对于内地地产 IPO项目的平均 PE 已经大幅度下调。
SOHO 中国 IPO 时市盈率接近 15 倍,碧桂园则高达 30 倍,但目前已经双双折损过半。
不排除今年后续赴港上市的地产商们IPO 过程会持续折价。
香港地区媒体6月披露,不少内地房地产企业准备以大折让作卖点进行 IPO,并称恒盛地产最高会以资产净值折让 50%作定价。
但即使如此,内地地产商还得突围。
在香港上市对于内地民营房地产企业至少有三点优势。
首先是香港市场的开放性,这儿是全球最自由的经济体,
经济自由度超过全球任何地区。
其次,香港市场的融资效率远高过内地,也比英美等要宽松。
港交所对于上市公司再配售新股的规定很宽松,甚至不需要股东大会批准,就可以有每年增发20%新股的机会,这对大股东来说是非常好的壮大公司的手段。
除了股票的配售发行,香港同时存在一个庞大的公司债券市场。
全球三大债券评级机构标普、穆迪、惠誉在香港均有分支机构,近来已经有不少内地地产商寻找这些国际评级机构进行债券评级。
有了这种评级
报告,公司发行债券的成本会比在内地更低。
一般情况下,当股票市场出现调整,公司再融资出现困难时,会转向债券市场。
2008 年初碧桂园便成功发行了 5 年期总额 39 亿元的债券。
在香港,在市场高涨时实施配售,大市低迷时发债,已经成为不少上市公司集资的惯用手法。
除了上述好处,香港市场的深度与广度也容易让财富“效应”迅速“变现”。
温不像内地A股存有大量的非流通股,其解禁可能给同行业的公司甚至大市造成较大波动。
来香港上市的民营地产商均多以红筹形式 IPO,他们的股票都是全流通的,大股东可以很方便地在市场上套现。
2010 年房地产企业内地融资难度增加,纷纷排队去香港上市,中信集团正在正考虑分拆旗下中信房地产上市,上市地点是香港或上海,惟未有透露时间表。
break 使用控件编程就是相对简单,
系统的串口消息发生时,
程序自动调用该函数。
由switch 语句判断,参数 1 为发送,参数 2 为接收。
Donald 主要介绍下接收的思路,由于接收时有两种模式,所以通过 m_bCcdMode 成员变量记录这两种模式。
当其为 FALSE 时直接实时显示在窗口右边, 就像 Windows 处事的超级终端。
如果是 TRUE,则不显示,将信息放到一个全局变量 g_strRcv。
其实尽量不要用全局变量,但 Donald 暂时也不懂线程间
通信,只能简单这么做了。
并置位全局变量g_bReceive。
该变量是在 CCD 模式下一个线程处理的依据,实时显示图像。
四、文本框实时显示和发送串口字符为了能实现 Windows 超级终端文本框的功能,我们必须手动修改 Edit 类,然后用 CWnd::SubclassDlgItem 提供的动态连接功能,将原来的文本框和修改的类连接起来。
利用 ClassWizard 新建一个 CEdit 类自己命名(如 CMyEdit,并在这个类中添加 WM_CHAR 消息处理函数和。
确定后,再在新建类的头文件中手动添加 void AppendText LPCSTR pText函数,用于将串口收到的字符输出在文本框中。
以及添加 CByteArray arraySend 成员变量,用于显示字符的临时存储。
Donald 程序中,CMyEdit::AppendTextLPCSTR pText的内容如下: int nLen GetWindowTextLength CString strTmp pText SetFocus ifstrTmp.GetAt0 char0X08 SetSel nLen - 1 nLen strTmp.Delete0 Clear else SetSel nLen nLen ReplaceSel pText 修改 CMyEdit::OnCharUINT nChar UINT nRepCnt UINT nFlags函数,该函数实现在文本控件中输入一字符时自动由串口向外发送。
代码如下: arraySend.RemoveAll arraySend.SetSize1 arraySend.SetAt0 charnChar CFSonPCDlgAfxGetApp-m_pMainWnd-m_com.SetOutputCOleVariantarraySend //CEdit::OnCharnChar nRepCnt nFlags程序的第四行语句必是向 Donald 的窗体串口控件关联变量 m_com 输出字符,注意要调用 COleVariant函数。
五、实时接收图像线程众所周知,如果一个程序用了 while1语句的话,那么这个程序将是一个死循环,将严重占用 CPU 资源,而这里,我们的程序又需要用 while 来实时地接收来自单片机的串口信息,于是,最好的解决方法就是用线程。
调用线程的思路是这样,当程序处于文本框模式时,线程是关闭的。
如果进行 CCD 模式,还没“连接”,程序状态同上,如果进行“连接”状态,则创建实时接收线程,并设置一定时器以在一定时间未接收到来自串口的握手信号时自动断开。
如果从“连接”状态手动或自动“断开”,则将线程终止,向单片机发送终止传送图像信号并关闭定时器。
至此,完成显示图像流程。
线程中首先是发送握手信号 FS_CONNECTION。
arraySend.SetSize1 arraySend.SetAt0 FS_CONNECTION g_bOvertime FALSE // Send Connection Signal CFSonPCDlgAfxGetApp-m_pMainWnd-m_com.SetOutputCOleVariantarraySend然后无限循环等待接收,用了两层 while 语句,第一个等待来自单片机的握手信号,第二个处理接收图像。
while1 // Wait for receiving CFSonPCDlgAfxGetApp-m_pMainWnd-GetDlgItemIDC_STATIC_NOW -SetWindowText等待... g_bReceive FALSE SetTimerAfxGetApp-GetMainWnd-m_hWnd 1 1000 NULL g_bOvertime TRUE whileg_bReceive KillTimerAfxGetApp-GetMainWnd-m_hWnd 1 g_bReceive FALSE g_bOvertime FALSE if -1 g_strRcv.FindFS_CONNECTION // Not found continue else CFSonPCDlgAfxGetApp-m_pMainWnd-GetDlgItemIDC_STATIC_NOW -SetWindowText连接完成 接收中 row 0 col 0 while1 SetTimerAfxGetApp-GetMainWnd-m_hWnd 1 1000 NULL g_bOvertime TRUE g_bReceive FALSE whileg_bReceive KillTimerAfxGetApp-GetMainWnd-m_hWnd 1 g_bReceive FALSE g_bOvertime FALSE //AfxMessageBoxg_strRcv n g_strRcv.FindFS_TRANFINISH if-1 n // Not finish n g_strRcv.GetLength fori 0 i n i cRcvrowcol g_strRcv.GetAti ifcol MAX_CCD_Y col 0 ifrow MAX_CCD_X row 0 else // Finish //n g_strRcv.FindFS_TRANFINISH fori 0 i n i cRcvrowcol g_strRcv.GetAti ifcol MAX_CCD_Y col 0 ifrow MAX_CCD_X row 0 CFSonPCDlgAfxGetApp-m_pMainWnd-m_ccdGraph.ChangeBitcRcv CFSonPCDlgAfxGetApp-m_pMainWnd-GetDlgItemIDC_STATIC_NOW -SetWindowText接收完毕 // Show it CFSonPCDlgAfxGetApp-m_pMainWnd-m_ccdGraph.ShowGraph CFSonPCDlgAfxGetApp-m_pMainWnd-m_dcViewS CFSonPCDlgAfxGetApp-m_pMainWnd-m_dcViewB.StretchBlt 0 0 MAX_CCD_X 4 MAX_CCD_Y 4 CFSonPCDlgAfxGetApp-m_pMainWnd -m_dcViewS.GetWindow-GetDC 0 0 MAX_CCD_X MAX_CCD_Y SRCCOPY break 结束语整个程序的总体思路便是如上,并没有对程序的每一个细节都作介绍。
书上和网上也能查到很多各种串口的程序,写得相当优秀,Donald 的程序比较粗糙,但基本能完成我们智能小车的调试功能,目的就达到了。
如果感兴趣,可向 Donald 要源码。