EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2008/10/22 1:58:25

1

关于投票

当Borland已成往事:献给曾经的Borland(作者--令狐虫&冷月无声)

一、当Borland已成往事

   老方说偶占着Borland分类的位子,却很久没谈Borland,想想也是。不过现在的Borland还有什么可谈的呢?

   昨天看了高论发的关于Borland最新的IDE——DeXter的一个DemoVideo,令狐8了一篇关于Borland的东东。对于Borland这个公司,我们的观点是基本一致的。

   Borland已经变了。不再是以前那个意气风发的江湖侠客,而是一个脑大肠肥的地方富贾;他拥有的,不再是那些充满灵气的开发工具,而是那些沾满铜钱味的企业解决方案。

   Borland,不再是我以前认识的那个Borland了。

   不过作为一家商业公司,利润远比技术理想更重要。当开发工具带来的利润越来越少时,在股东的压力下,必须要有新的利润增长点才行。

   七八年前,Borland第一次尝试从开发工具领域向企业应用领域时,公司甚至为此改了个名字叫Inprise。结果Anders离开了,Borland差点把自己玩死。

   前一两年,Borland又开始转向企业解决方案,不过这次是针对软件开发企业,倒还没有偏离太多。但结果又是Black.Stone, Chuck.Jazdzewski等人离开了。

   与此相反的,Borland的每一次辉煌,都与开发工具紧密相连。

   83年公司成立,就是仗着Anders的成名作:Turbo Pascal 1.0。之后的整个DOS时代,开发工具几乎都是Borland的天下:Turbo Pascal,Turbo C,Turbo C++……

   Windows 3.x的时代,又是Borland的Borland C++出来拯救了广大的开发人员。再之后便是Delphi。

   但是这些都已经是往事了(详情请自行参见李维的《Borland传奇》一书)。

   问题在于现在如何了呢?

 自从.net出来以后,Borland就乱了阵脚。首先是Kylix表现平平,加之Borland打算加入Linux阵营领导集团的企图也告失败,只好退出Linux平台下的开发工具领域。然后是MS放出风声说要把Win32全部转到.net下,Borland又匆匆忙忙推出for .net的C#Builder和Delphi 8,结果又是大败。想要搞一个平台无关的C++BuilderX,同样还是惨遭失败。

   当C++BuilderX出来时,我写过一篇《C++ BuilderX的问题与展望》,后来在Delphi 2005出来前,我又写了一篇《传说中的DELPHI9--DiamondBack》。但是现在还有什么好写的呢?

   这个DeXter看上去还好:仍然是那个叫Galileo的IDE,也许它会是BDS4,还是在.net平台下跑,比Delphi 2005增加了对原生C++的支持,基本上相当于把C++Builder 6集成到Delphi 2005里。仅此而已。

   当然,要说增强的方面也不是没有,至少Delphi 2005中增加的像重构,单元测试,增强的调试功能……这些都是C++ Builder 6所没有的。且不说这些方面在DeXter中能做到什么程度还是一个未知数,更何况在Delphi.net中那些重量级的增强功能像ECOII和 Together却应该是用不上的。最关键的是:

   一个做原生C++应用开发的,为什么需要依赖.net?

   C+ +BuilderX用的IDE——PrimeTime——依赖JAVA已经让人很不爽了。VS做大而全有它的平台基础,Borland没有自己的平台,在.net下根本不是VS.net的对手。还不如放弃这个Galileo的IDE,把Delphi.net、Together、ECOII以for VS.net的方式提供,集中力量把该做的事做好。至于原生应用,就继续按照原生的路子走,别老想着把原生的东西弄到某个平台上,不论是.net还是 JAVA。

   一不小心又对Borland指手划脚了,还是回头做我的ABAP吧。.net还是JAVA跟偶有什么关系呢?

   也许到很多年以后,当有人提起Borland时,我大概还是会想起曾经发生过的那些往事吧。

   BTW:据蔡蔡回复说DeXter是基于Eclipse的CDE,如果是这样的话,那还不错。不过我很怀疑Borland会真的下定决心抛弃Galileo和PrimeTime这两个IDE,而转向Eclipse。毕竟Borland不是IBM。

二、献给曾经的Borland

   不记得曾经多久没有谈论和关心Borland了。每天习惯性的输入“borland.mblogger.cn”的时候,居然也很少联想到这个曾经心目中最了不起的公司。

   今天老鼠发了一个Borland新版IDE的Flash演示。虽然现在看到新版的Borland产品,不再像以前那样心潮澎湃欣喜若狂,但还是让我不自觉的想起曾经迷恋Borland,迷恋Borland产品,迷恋Borland传奇的那些日子。

   注册了Borland板块的Blog以来,我几乎没有写过一篇跟borland有关的blog,心里不免是有些愧疚的,今天,借着这个机会,让我小小的弥补一下吧。

   曾经的Borland像一个侠客,面对微软、IBM、Sun这样的大公司,Borland一不趋炎附势,二不低头认输,虽然曾经几起几伏,但还是凭借自己在RAD工具、C++编译器方面的深厚功力顽强生存了下来,并且在软件开发的市场占有了一席之地。

   Turbo C 2.0、Turbo Pascal 7.0、Borland C++ 3.1,这些昔日的经典作品,曾经让多少人废寝忘食,从此走上编程之路。

   Delphi、JBuilder、C++ Builder,这些重量级的产品,又曾经让多少人如释重负,将枯燥乏味的Windows开发变成轻松的享受。

   就连那些失败的产品,也可圈可点。比如Kylix,险些就改变了Linux下应用程序的开发方式;比如C++Builder X,提出的很多概念让人耳目一新。

   如果不是那该死的.NET……

   微软的.NET宣传突然间铺天盖地,来势汹汹,为我们营造了一个“.NET everywhere”的世界。比起其前辈Java的“write once, run everywhere”有过之而无不及。在如此强大的宣传攻势下,有几个人能够保持清醒的头脑呢?

   Borland自然也不例外,他希望自己再次站在.NET的前沿阵地。

   于是,C# Builder来了,Delphi.NET 也来了。

 但是.NET和Windows API不一样。Windows API是flat function的形式,对于OOP并不十分友好,甚至有些理念(如回调函数)还有相冲突之处,因此,VCL将其封装成OO的形式,是十分有利于快速开发的;而.NET从一诞生起就考虑到了组件化和可视化的问题,因此,使用VCL将其再次封装,不仅没有什么好处,反而让人产生了使用上的不习惯。

   再加上如今.NET并没有微软当初宣传的那样流行,Borland的迎合举动,反而让自己陷入了一个尴尬境地。

   在.NET宣传如日中天的时候,C++ Builder坚持走本地化开发的路,总算是Borland的一次明智举动,否则,如今的BCB一定会像managed C++那样消失的无影无踪(因为Borland不可能敢像微软那样大刀阔斧的改动C++本身)。但是,那个如同测试版一样的BCBX实在是伤了大家的心,BCB也因此险些从Borland的开发计划中消失。真是可悲可叹。

   其实当初BCBX的概念提出的时候我是非常看好它的,因为它的许多概念(比如多GUI框架支持,多编译器、多平台支持,C++代码重构)都是很先进的。可惜那个最终实现……

   现在,Borland新的产品又出现了。很久没有关注Borland的我,没有了以前的那份激动。我的感觉是,产品成熟了,但是没有了那份锐气。

   Borland的网站也改版了,遵循了XHTML标准,板块区分也清晰了。但是,以前长长一串的products名单,现在变成了寥寥3项:Application LifeCycle、IDE、Application Middleware。

   Borland已经变了。不再是以前那个意气风发的江湖侠客,而是一个脑大肠肥的地方富贾;他拥有的,不再是那些充满灵气的开发工具,而是那些沾满铜钱味的企业解决方案。

   Borland,不再是我以前认识的那个Borland了。

   看着现在的borland.com首页,我突然想起了《白马啸西风》中的一句话:

   那都是很好很好的,可是我偏不喜欢。

   就让从前的那个Borland,伴随着他的经典作品,一起封存在我的记忆中吧。

系统分类: 软件开发  |  用户分类: Delphi语言设计  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(299) | 回复(0)

发表于 2007/12/14 7:47:02

2

关于投票

FlashMagic应用程序FMExec的delphi源码程序下载

本应用程序是利用Windows的API函数CreateProcess()来调用FlashMagic的命令行程序FM.exe实现LPCARM的ISP功能的.

它还将Keil也加入其中,自动改写Keil ARM的配置,并与FlashMagic的配置同步.

即FlashMagic运行的设置和FMExec的设置是可以互相利用的.

本应用程序纯属菜农的开心游戏,但转载请注明出处~~~

雁塔菜农HotPower@126.com      菜地: http://www.ednchina.com/blog/hotpower/

点击下载源程序: FMExec.rar  rar

 

在Keil内调用FlashMagic命令行FlashISP的应用方法(菜农实验)

关于FlashMagic软件设置LPCARMISP问题

 

 

 

 

系统分类: 汽车电子  |  用户分类: Delphi语言设计  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1589) | 回复(1)

发表于 2007/4/22 17:43:41

4

关于投票

转帖:如何Delphi安装面板没有的控件

http://bbs.2ccc.com/topic.asp?topicid=49580

如果你的internet中没有那么这样做:
经常有朋友提这样的问题,“我原来在delphi5或者delphi6中用的很熟的控件到哪里去了?是不是在delphi7中没有了呢?这是不是意味着我以前写的代码全都不能够移植到delphi7中来了呢?是不是我必须学习适应这些新的控件呢?” 

现在我就对这一问题进行解释,并对在delphi7中的VCL以及CLX进行一下总结,方便有这方面需求的朋友进行查询

其实,我们在原来版本如D5、D6中使用的控件如Quickrep,FastNet等,在D7中仍然是保留的。只是Delphi没有将他们默认的安装到组件面版中来。这些控件包全部保存在Delphi目录的bin下,文件扩展名为.bpl(共将近60个)。
安装这些包的方法很简单,只需点击菜单"component---->Install Packages...",然后使用"ADD"选择需要的包就可以了。


下面就其中的一部分bpl列表说明其中的控件:

dclact70.bpl (Borland Actionbar Components)
包括的控件:TStandardColorMap、TTwilightColorMap、TXPColorMap、TActionToolBar、TActionManager、TActionMainMenuBar、TCustomizeDlg

dclado70.blp(Borland ADO DB Components)
包括的控件:TADOCommand、TADOConnection、TADODataSet、TADOQuery、TADOStoredProc、TADOTable、TRDSConnection

dclbde70.bpl(Borland BDE DB Components)
包括的控件:TDBLookupCombo、TDBLookupList、TBatchMove、TDatabase、TNestedTable、Tquery、TSession、TStoredProc、TTable、TUpdateSQL

dclclxdb70.bpl(Borland CLX Database Components)
包括的控件:TDBCheckBox、TDBComboBox、TDBEdit、TDBImage、TDbListBox、TDBLookupComboBox、TDBLookupListBox、TDBMemo、TDBNavigator、TDBRadioGroup、TDBText、TDBGrid

dclclxstd70.bpl(Borland CLX Standard Components)
包括的控件:TActionList、TBitBtn、TSpeedButton、TCheckListBox、TAnimate、THeaderControl、TIconView、TListView、TPageControl、TProgressBar、TSpinEdit、TStatusBar、TTabControl、TTextBrowser、TTextViewer、TToolBar、TTrackBar、TTreeView、TColorDialog、TFindDialog、TFontDialog、TOpenDialog、TSaveDialog、TBevel、TControlBar、TImage、TPaintBox、TPanel、TRadioGroup、TShape、TSplitter、TTimer、TDirectoryTreeView、TFileEdit、TFileHistoryComboBox、TFileIconView、TFileListView、TFilterComboBox、TDrawGrid、TImageList、TMaskEdit、TMainMenu、TPopupMenu、TButton、TCheckBox、TComboBox、TEdit、TGroupBox、TLabel、TLCDNumber、TListBox、TMemo、TRadioButton、TScrollBar

dcldb70.bpl(Borland Database COmponents)
包括的控件:TDdataSourse、TDBCtrlGrid、TDBCheckBox、TDBComboBox、TDBEdit、TDBImage、TDBListBox、TDBLookupComboBox、TDBLookupListBox、TDBMemo、TDBNavigator、TDBRadioGroup、TDBRichEdit、TDBText、TDBGrid

dclmcn70.bpl(Borland DataSnap Connection Components)
包括的控件:TConnectionBroker、TDCOMConnection、TSharedConnection、TSimpleObjectBroker、TSocketConnection、TWebConnection、TLocalConnection

dcldbx70.bpl(Borland dbExpress Components)包括的控件:TSQLConnection、TSQLDataSet、TSQLMonitor、TSQLQuery、TSQLStoredProc、TSQLTable

dcldss70.bpl(Borland Decision Cube Components)
包括的控件:TDecisionCube、TDecisioinSource、TDecisionGraph、TDecisionGrid、TDecisionPivot、TDecisionQuery

ibevnt70.bpl(Borland Interbase Event Alerter Component)
包括的控件:TIBEventAlerter

dclnet70.bpl(Borland Internet Components)
包括的控件:TQueryTableProducer、TDataSetTableProducer、TSQLQueryTableProducer、TDataSetPageProducer、TWebDispatcher、TPageProducer、TTcpClient、TTcpServer、TUdpSocket、TXMLDocument

dclisp70.bpl(Borland Internet Solutions Pack Components)
包括的控件:TFTP、THTML、THTTP、TNNTP、TPOP、TSMTP、TTCP、TUDP

dclwbm70.bpl(Borland InternetExpress Components)
包括的控件:TInetXPageProducer、TMidasPageProducer、TXMLBroker、TXMLTransform、TXMLTransformClient、TXMLTransformProvider

dclmid70.bpl(Borland MyBase DataAccess Components)
包括的控件:TClientDataSet、TDataSetProvider

dclsmp70.bpl(Borland Sample Components)
包括的控件:TCalendar、TColorGrid、TDirectoryOutline、TGauge、TSpinButton、TSpinEdit

dclocx70.bpl(Borland Sample Imported ActiveX Controls)
包括的控件:TChartfx、TF1Book、TVtChart、TVSSpell

dcldbxcds70.bpl(Borland SimpleDataset Component(DBX))
包括的控件:TSimpleDataSet

dclsoap70.bpl(Borland SOAP Components)
包括的控件:TOPToSoapDomConvert、TSoapConnectoin、THTTPRIO、THTTPSoapPascalInvoker、THTTPReqResp、THTTPSoapDispatcher、TWSDLHTMLPublish

dclsockets70.bpl(Borland Socket Components)
包括的控件:TClientSocket、TServerSocket

dclstd70.bpl(Borland Standard Components)
包括的控件:TActionList、TApplicationEvents、TBitBtn、TSpeedButton、TCheckListBox、TCOMAdminCatalog、TAnimate、TComboBoxEx、TCoolbar、TDateTimePicker、THeaderControl、THotKey、TListView、TMonthCalendar、TPageControl、TPageScroller、TProgressBar、TRichEdit、TStatusBar、TTabControl、TToolBar、TTrackBar、TTreeView、TUpDown、TImageList、TDdeClientConv、TDdeClientItem、TDdeServerConv、TDdeServeritem、TColorDialog、TFindDialog、TFontDialog、TOoenDialog、TPageSetupDialog、TPrintDialog、TPrinterSetupDialog、TReplaceDialog、TSaveDialog、TBevel、TColorBox、TControlBar、TImage、TLabeledEdit、TPaintBox、TPanel、TRadioGroup、TShape、TSplitter、TTimer、TOpenPictureDialog、TSavePictureDialog、TScrollBox、TDrawGrid、TStringGrid、TMaskEdit、TMainMenu、TmediaPlayer、TOleContainer、TButton、TCheckBox、TComboBox、TEdit、TGroupBox、TLabel、TListBox、TMemo、TRadioButton、TScrollBar、TStaticText、TvalueListEditor、TXPManifest

dclwebsnap70.bpl(Borland WebSnap Components)
包括的控件:TDataSetAdapter、TDataSetvaluesList、TAdapterPageProducer、TAdapter、TApplicationAdapter、TEndUserAdapter、TEndUserSessionAdapter、TLoginFormAdapter、TPagedAdapter、TStringsvaluesList、TAdapterDispatcher、TLocateFileService、TPageDispatcher、TWebAppComponents、TSessionsService、TWebUserList、TXSLPageProducer

dcl31w70.bpl(Delphi1.0 Compatibility Components)
包括的控件:THeader、TNotebook、TDirectoryListBox、TDriveComboBox、TFileListBox、TFilterComboBox、TOutline、TTabbedNotebook、TTabSet

DCLIB70.bpl(InterBase DataAccess Components)
包括的控件:TIbClientDataSet、TIBDataSet、TIBDatabase、TIBTransaction、TIBDatabaseinfo、TIBevents、TIBExtract、TIBQuery、TIBSQL、TIBSQLMonitor、TIBStoredProc、TIBTable、TIBUpdateSQL

dclindy70.bpl(Internet Direct(Indy)for D7 Property and Component Editors)
包括的控件:TIdAntiFreeze、TIdBlockCipherIntercept、TIdChargenServer、TIdChargenUDPServer、TIdDecodeMIME、TIdEncodeMIME、...

dclie70.bpl(Internet Explorer Components)
包括的控件:TWebBrowser

dclIntraweb_50_70.bpl(Intraweb 5.0 Design Package for Delphi7)
包括的控件:TIWClientSideDataset、TIWCheckBox、TIWButton、TIWEdit...

dcloffice2k70.bpl(Microsoft Office 2000 Sample Automation Server Wrapper Components)
包括的控件:TAccessApplicatoin、TAccessForm、TAccessReferences、TAccessReport、TClass_、TBinder、TExcelApplication、TExcelChart、TExcelOLEOBject、EExcelQueryTable、TExcelWorkbook、TExcelWorksheet、Tmaster、TPowerPointApplication、TPowerPointPresentation、TPowerPointSlide、TContactItem、TDistListItem、TDocumentItem、TExplorers、TFolders、TInspectors、TItems、TJournalItem、TnameSpace、TOutlookApplication、TOutlookBarGroups、TOutlookBarPane、TOutlookBarShortcuts、TPostItem、TRemoteItem、TReportItem、TTaskRequestAcceptItem、TTaskRequestAcceptItem、TTaskRequestDeclineItem、TTaskRequestItem、TTaskRequestUpdateItem、TWordApplication、TWordDocument、TWordFont、TWordLetterContent、TWordParagraphFormat

dclqrt70.bpl(QuickReport Components)
包括的控件:TQRDBImage、TQRDBRichText、TQRDBText、TQRExpr、TQRExprMemo、TQRImage、TQRLabel、TQRLabel、TQRMemo、TQRRichText、TQRShape、TQRSysData、TQRCSVFilter、TQRHTMLFilter、TQRTextFilter、TQRPreview、TQRBand、TQRChildBand、TQRCompositeReport、TQRGroup、TQRStringsBand、TQRSubDetail、TQuickRep

dclRave70.bpl(Rave Reports DE 5.0 Package)
包括的控件:TRvCustomConnection、TRvQueryConnection、TRvTableConnection、TRvDataSetConnection、TRvNDRWrite、TRvProject、TRvRenderHTML、TRvRenderPDF、TRvRenderPreview、TRvRenderPrinter、TRvRenderRTF、TRvRenderText、TRvSystem、TRvCustomConnection、TRvTableConnection、TRvDataSetConnection、TRvNDRWriter、TRvProject

dclshlctrls70.bpl(Shell Control Property and Component Editors)
包括的控件:TShellChangeNotifier、TShellComboBox、TShellListView、TShellTreeview

dcltee70.bpl(TeeChart Components)
包括的控件:TChart、TDBChart

dcltqr70.bpl(TeeChart for QuickReport Components)
包括的控件:TQRChart

系统分类: 软件开发  |  用户分类: Delphi语言设计  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(1913) | 回复(0)

发表于 2006/12/28 22:57:39

3

关于投票

串口控件SPComm多方法使用例程

点击下载:spcommdemo.rar

重点:(注意:本例程一定要将串口的2,3脚短联做自发自收演示)

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  str: string;
begin
  str := '';
  for i := 0 to 2047 do
  begin
    str := str + Char(i and $ff);//所有字符0x00~0xff
  end;
  Comm1.PortOpen := true;//打开串口(注意:本例将串口的2,3脚短联做自发自收演示)
  Comm1.Output := str;//发送2048个字符到串口
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: PAnsiChar;//旧事件处理方法用Buffer: Pointer
  BufferLength: Word);
var
  i: integer;
  str: string;
begin                                      

  Memo1.Lines.Add('SPCOMM控件改造应用方法一:(String)');
  SetString(str, Buffer, BufferLength);//从串口接收BufferLength个字节
  if Length(str) <> BufferLength then Exit;
  for i := 0 to BufferLength - 1 do
  begin
    if (i and $f) = 0 then
    begin
      Buffers := inttohex(i, 4) + ': ';
    end;
    if (i and $ff) = Byte(str[i + 1]) then//str[i]从str[1]开始
      Buffers := Buffers + '0x' + inttohex(Byte(str[i + 1]), 2) + ' '
    else //接收错误显示
      Buffers := Buffers + '**/' + inttohex(Byte(str[i + 1]), 2) + ' ';
    if (i and $f) = $f then
    begin
      Memo1.Lines.Add(Buffers);//输出一行显示数据
      Buffers := '';
    end;
  end;

  Memo1.Lines.Add('');
  Memo1.Lines.Add('SPCOMM控件改造应用方法二:(Array)');
  for i := 0 to BufferLength - 1 do
  begin
    if (i and $f) = 0 then
    begin
      Buffers := inttohex(i, 4) + ': ';
    end;
    if (i and $ff) = Byte(Buffer[i]) then//Buffer[i]从Buffer[0]开始
      Buffers := Buffers + '0x' + inttohex(Byte(Buffer[i]), 2) + ' '
    else //接收错误显示
      Buffers := Buffers + '**' + inttohex(Byte(Buffer[i]), 2) + ' ';
    if (i and $f) = $f then
    begin
      Memo1.Lines.Add(Buffers);//输出一行显示数据
      Buffers := '';
    end;
  end;

  Memo1.Lines.Add('');
  Memo1.Lines.Add('SPCOMM控件改造应用方法三:(Pointer)');
  for i := 0 to BufferLength - 1 do
  begin
    if (i and $f) = 0 then
    begin
      Buffers := inttohex(i, 4) + ': ';
    end;
    if (i and $ff) = Byte((Buffer + i)^) then//Buffer+i从Buffer开始
      Buffers := Buffers + '0x' + inttohex(Byte((Buffer + i)^), 2) + ' '
    else //接收错误显示
      Buffers := Buffers + '**' + inttohex(Byte((Buffer + i)^), 2) + ' ';
    if (i and $f) = $f then
    begin
      Memo1.Lines.Add(Buffers);//输出一行显示数据
      Buffers := '';
    end;
  end;

  Memo1.Lines.Add('');
  Memo1.Lines.Add('SPCOMM控件改造应用方法四:(Pointer)');
  for i := 0 to BufferLength - 1 do
  begin
    if (i and $f) = 0 then
    begin
      Buffers := inttohex(i, 4) + ': ';
    end;
    if (i and $ff) = Byte(Buffer^) then
      Buffers := Buffers + '0x' + inttohex(Byte(Buffer^), 2) + ' '
    else //接收错误显示
      Buffers := Buffers + '**' + inttohex(Byte(Buffer^), 2) + ' ';
    if (i and $f) = $f then
    begin
      Memo1.Lines.Add(Buffers);//输出一行显示数据
      Buffers := '';
    end;
    Inc(Buffer, SizeOf(Char));//移动字符指针
  end;

end;

系统分类: 工业控制  |  用户分类: Delphi语言设计  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(4979) | 回复(0)

发表于 2006/12/28 22:56:24

1

关于投票

经过改造的Delphi环境下应用的串口控件SPComm

点击下载:SPComm.rar

希望Delphi迷喜欢~~~

菜农HotPower  2006.9.28 于西安大雁塔村队部

系统分类: 工业控制  |  用户分类: Delphi语言设计  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(3178) | 回复(4)

发表于 2006/12/28 22:55:20

2

关于投票

在Delphi中使用串口控件MSComm的0字符接收例程祥解

//以下是创建窗体时的MSCOMM参数设置过程

//MSComm1.InputMode := comInputModeBinary;

//和MSComm1.InputMode := comInputModeText;

//实验结果基本对Delghi不太起作用


procedure TForm1.FormCreate(Sender: TObject);
var
  str: string;
begin
//MSCOMM参数设置
  MSComm1.CommPort := 1;//使用COM1
  MSComm1.Settings := '9600,N,8,1';//设置通信口参数
  MSComm1.InBufferSize := 32;//设置MSComm1接收缓冲区为32字节
  MSComm1.OutBufferSize := 2;//设置MSComm1发送缓冲区为2字节
  MSComm1.InputMode := comInputModeBinary;//设置接收数据模式为二进制形式
  MSComm1.InputLen := 1;//设置Input 一次从接收缓冲读取字节数为1
  MSComm1.SThreshold := 1;//设置Output 一次从发送缓冲读取字节数为1
  MSComm1.InBufferCount := 0;//清除接收缓冲区
  MSComm1.OutBufferCount := 0;//清除发送缓冲区
  MSComm1.RThreshold := 1;//设置接收一个字节产生OnComm事件
  MSComm1.PortOpen := true;//打开串口1
/////////////////////////////////////////////////////////////
  Buffers := '';
  CheckSum := 0;
//发送串口命令
  Command := 34;
  str := '$' + #2 + #$22 + #1;//读MP3总曲目
  str := str + Char(GetCheckSum(str));//计算校验和
  MSComm1.Output := str;//发送串口命令
end;

//以下是接收事件处理过程,在MCU中相当于串口中断

//注意其中2个语句

//while MSComm1.InBufferCount > 0 do//输入FiFO不为空
//if str = '' then str := #0; //0字符处理
//例接收的数据为#24#02#00#01#03

//此时InBufferCount=5.若设置Input 一次从接收缓冲读取字节数不限

//即:MSComm1.InputLen := 0;则str := MSComm1.Input;后str好象为#24#02#00#01#03

//但实际为'??'#24#02.总得不到结果,至少0字符后的#01#03无法读出.

//采用MSComm1.InputLen := 1;后,并配合while MSComm1.InBufferCount > 0 do

//当读到0字符时,由于str=''(空),故访问str[1]将会引发异常的发生而导致程序的终止.

//故用if str = '' then str := #0; 来向str[1]内认为地填入字符#0且str的长度也为1了.

//故此要点是用if str = '' then str := #0;语句渡过读0字符的难关~~~

procedure TForm1.MSComm1Comm(Sender: TObject);
var
  str: string;
  i: integer;
begin
  case MSComm1.CommEvent of
    comEvReceive://接收事件处理
      begin
        while MSComm1.InBufferCount > 0 do//输入FiFO不为空
        begin
          str := MSComm1.Input;//从FIFO中只取1个字符,因为MSComm1.InputLen := 1
          if str = '' then str := #0; //0字符处理
          if (Buffers = '') and (str = '$') then//同步符测试
          begin
            Buffers := str;//存入同步符'$'
            CheckSum := 0;//初始化校验和
          end
          else if (Buffers <> '') and (Buffers[1] = '$') then begin//必须用同步符起始
            Buffers := Buffers + str;//加入数据串
            CheckSum := CheckSum xor Byte(str[1]);//求校验和(除同步符'$'外)
            if Length(Buffers) = Byte(Buffers[2]) + 3 then//结束符测试
            begin
              if CheckSum = 0 then//此时校验和必须为0表示校验和正确
              begin
                case Command of
                  $22: begin//取歌曲总数
                        ComboBox1.Items.Clear;
                        for i := 1 to Byte(Buffers[4]) do
                        begin
                          str := '第' + inttostr(i) + '首歌曲';
                          ComboBox1.Items.Add(str);//
                        end;
                        Command := 0;
                      end;
                  1: ;
                else ;
                end;
              end;
              Buffers := '';//接收完毕清空缓冲区
              CheckSum := 0;//初始化校验和
            end;
          end
          else
          begin
            Buffers := '';//接收错误清空缓冲区,放弃所有数据
            CheckSum := 0;//初始化校验和
          end;
        end;
      end;
  end;
end;

系统分类: 工业控制  |  用户分类: Delphi语言设计  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(3084) | 回复(0)

Total , Page /