哪位大侠有用API函数做的串口调试软件啊,给俺参考一下,谢啦!(100分)

  • 主题发起人 主题发起人 fox_s
  • 开始时间 开始时间
F

fox_s

Unregistered / Unconfirmed
GUEST, unregistred user!
我的email是pbhan@sina.com<br>qq:2306205<br>谢谢啦
 
三个函数<br>打开串口<br>读文件<br>写文件
 
问题: 十万火急!谁能为我提供一个读写串口程序?300分 ( 积分: 300 ) &nbsp;<br>分类: 局域网 / 通讯 &nbsp;<br> <br>来自: lylyly, 时间: 2000-05-18 16:23:01, ID: 247756 &nbsp;<br>小弟正在编写一个地磅的程序,须要实时读出到达串口的数据?有哪位大虾 <br>写过这方面的程序,请将例子发过来,测试通过立即送分。最好在5月21日以 <br>前,赶着救命。E-mail:liu--yu@yeah.net,jun_ly@21cn.com <br> <br>来自: volan, 时间: 2000-05-18 16:42:12, ID: 247765 &nbsp;<br>去 http://delphi.nease.net/mirror/delphi/DELPHIGB/DEFAULT.HTM 看看,或许会有所收获! <br><br>Good Lucky <br><br> <br>来自: lenny, 时间: 2000-05-18 21:45:15, ID: 248022 &nbsp;<br>看看这: <br>http://home4u.china.com/technology/programming/topgun1/new/new000223.html <br>其实用MSCOMM+API,事件触发就行了…… <br> <br>来自: wangjing2, 时间: 2000-06-05 16:05:09, ID: 260537 &nbsp;<br>是使用mscomm控件,关于它的用法,见msdn. <br> <br>来自: 程云, 时间: 2000-06-05 16:42:58, ID: 260551 &nbsp;<br>看看有用吗? <br><br>  随着现代信息技术的发展以及计算机网络的广泛使用,计算机通信技术已经日臻成熟,但串行通信作为一种灵活方便可靠的通信方式,仍不失为有效的通信手段,被广泛应用于工业控制中。在工业生产实践中,用PC机对工程实现实时监控,通常要求PC机能在用户界面上具有数据采集、数据处理以及控制信号的产生与传输等功能。在这种特定的环境下,PC机要与过程控制的实时信号相联系,就要求能实现对PC机的串行端口直接操作。Borland公司推出的Delphi是一种功能强大的高级编程语言,其具有的可视化面向对象的特性,特别适于在Windows环境下图形界面和用户程序的编制。本文就是介绍基于Windows95/NT操作系统用Delphi来实现PC机与下层PLC控制器之间的串口通信方法。 <br><br>基于WIN95/NT的串行通信机制 <br>  Windows操作系统的机制禁止应用程序直接访问计算机硬件,但它为程序员提供了一系列的标准API函数,使得应用程序的编制更加方便并且免除了对有关硬件的调试麻烦。在Windows95/NT中,原来Windows3.X的WM_COMMNOTIFY消息已被取消,操作系统为每个通信设备开辟了用户可定义大小的读/写缓冲区,数据进出通信口均由操作系统后台完成,应用程序只需对读/写缓冲区操作即可。WIN95/NT中几个常用的串行通信操作函数如下: <br><br>   CreatFile  : 打开串行口 <br>   CloseHandle : 关闭串行口 <br>   SetupComm  : 设置通信缓冲区的大小 <br>   ReadFile   : 读串口操作 <br>   WriteFile  : 写串口操作 <br>   SetCommState : 设置通信参数 <br>   GetCommState : 获取默认通信参数 <br>   ClearCommErro: r清除串口错误并获取当前状态 <br>   除上述几个函数外,还要经常用到一个重要的记录DCB(设备控制块)。DCB中记录有可定义的串行口参数,设置串行口参数时必须先用GetCommState函数将系统默认值填入DCB控制块,然后才可把用户想改变的自定义值设定。在WIN95/NT中进行串行通信除了解基本的通信操作函数外,还要掌握多线程编程。线程是进程内部执行的路径,是操作系统分配CPU时间的基本实体。每个进程都由单线程开始完成应用程序的执行。串行通信需要利用多线程技术实现,其主要的处理逻辑可以表述如下:进程一开始先由主线程做一些必要的初始化工作,然后主线程根据需要在适当时候建立通信监视线程监视通信口,当指定的串行口事件发生时,向主线程发送WM_COMMNOTIFY消息(由于WIN95取消了WM_COMMNOTIFY消息,因此必须自己创建),主线程对其进行处理。若不需要WM_COMMNOTIFY消息,则主线程终止通信监视线程。多线程同时执行,将会引起对共享资源的冲突。为避免冲突,就要用同步多线程对共享资源进行访问。WIN95提供了许多保持线程同步的方法,笔者采用创建事件对象来保持线程同步。通过CraeteEvent()创建事件对象,使用SetEvent() 或PulseEvent()函数将事件对象设置成信号同步。在应用程序中,利用WaitSingleObject() 函数等待同步的触发,等到指定的事件被其它线程设置为有信号时,才继续向下执行程序。 <br><br>Delphi下的具体实现方法 <br>  Delphi的强大功能和支持多线程的面向对象编程技术,使得实现串行通信非常简单方便。它通过调用外部的API函数来实现,主要步骤如下:首先,利用CreateFile函数打开串行口,以确定本应用程序对此串行口的占有权,并封锁其它应用程序对此串口的操作;其次,通过GetCommState函数填充设备控制块DCB,再通过调用SetCommState函数配置串行口的波特率、数据位、校验位和停止位。然后,创建串行口监视线程监视串行口事件。在此基础上就可以在相应的串口上操作数据的传输;最后,用CloseHandle函数关闭串行口。具体的程序如下,本程序用Delphi3.0编制在Win95环t境下调试通过,已投入实际应用中,供广大读者参考。 <br>程序: <br>unit comdemou; <br>interface <br>uses <br> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; <br>const <br> &nbsp; &nbsp;Wm_commNotify=Wm_User+12; <br>type <br> TForm1 = class(TForm) <br> &nbsp; procedure FormCreate(Sender: TObject); <br> private <br> &nbsp; Procedure comminitialize; <br> &nbsp; Procedure MsgcommProcess(Var Message:Tmessage); Message Wm_commnotify; <br> &nbsp; { Private declarations } <br> public <br> &nbsp; { Public declarations } <br> end; <br> // 线 程 声 明 <br> TComm=Class(TThread) <br> protected <br> &nbsp; &nbsp;procedure Execute;override; <br> end; <br>var <br> Form1: TForm1; <br> hcom,Post_Event:Thandle; <br> lpol:Poverlapped; <br>implementation <br>{$R *.DFM} <br>Procedure TComm.Execute; &nbsp; &nbsp;// 线 程 执 行 过 程 <br>var <br>dwEvtMask:Dword; <br>Wait:Boolean; <br>Begin <br>fillchar(lpol,sizeof(toverlapped),0); <br>While True do Begin <br> &nbsp; &nbsp; dwEvtMask:=0; <br> &nbsp; &nbsp; Wait:=WaitCommEvent(hcom,dwevtmask,lpol); &nbsp;// 等 待 串 行 口 事 件; <br> &nbsp; &nbsp; if Wait Then Begin <br> &nbsp; &nbsp; &nbsp; &nbsp;waitforsingleobject(post_event,infinite); &nbsp; &nbsp; &nbsp;// 等 待 同 步 事 件 置 位; <br> &nbsp; &nbsp; &nbsp; &nbsp;resetevent(post_event); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 同 步 事 件 复 位; <br> &nbsp; &nbsp; &nbsp; &nbsp;PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);// 发 送 消 息; <br> &nbsp; &nbsp; &nbsp; &nbsp;end; <br> &nbsp; &nbsp; end; <br>end; <br><br>procedure Tform1.comminitialize; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 串 行 口 初 始 化 <br>var <br>lpdcb:Tdcb; <br>Begin <br>hcom:=createfile('com2',generic_read or generic_write,0,nil,open_existing, <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; file_attribute_normal or file_flag_overlapped,0);// 打 开 串 行 口 <br> &nbsp; if hcom=invalid_handle_value then <br> &nbsp; else <br> &nbsp; &nbsp; &nbsp;setupcomm(hcom,4096,4096); // 设 置 输 入, 输 出 缓 冲 区 皆 为4096 字 节 <br> &nbsp; &nbsp; &nbsp; getcommstate(hcom,lpdcb); &nbsp;// 获 取 串 行 口 当 前 默 认 设 置 <br> &nbsp; &nbsp; &nbsp; lpdcb.baudrate:=2400; <br> &nbsp; &nbsp; &nbsp; lpdcb.StopBits:=1; <br> &nbsp; &nbsp; &nbsp; lpdcb.ByteSize:=8; <br> &nbsp; &nbsp; &nbsp; lpdcb.Parity:=EvenParity; &nbsp; &nbsp;// 偶 校 验 <br> &nbsp; &nbsp; &nbsp; Setcommstate(hcom,lpdcb); <br> &nbsp; &nbsp; &nbsp; setcommMask(hcom,ev_rxchar); <br> &nbsp; &nbsp;// 指 定 串 行 口 事 件 为 接 收 到 字 符; <br>end; <br>Procedure TForm1.MsgcommProcess(Var Message:Tmessage); <br>var <br>Clear:Boolean; <br>Coms:Tcomstat; <br>cbNum,ReadNumber,lpErrors:Integer; <br>Read_Buffer:array[1..100]of char; <br>Begin <br>Clear:=Clearcommerror(hcom,lpErrors,@Coms); <br>if Clear Then Begin <br> &nbsp;cbNum:=Coms.cbInQue; <br> &nbsp;ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol); <br> &nbsp;// 处 理 接 收 数 据 <br> &nbsp;SetEvent(Post_Event); &nbsp; &nbsp; &nbsp; &nbsp; // 同 步 事 件 置 位 <br> &nbsp;end; <br>end; <br>procedure TForm1.FormCreate(Sender: TObject); <br>begin <br>comminitialize; <br>post_event:=CreateEvent(nil,true,true,nil); // 创 建 同 步 事 件; <br>Tcomm.Create(False); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 创 建 串 行 口 监 视 线 程; <br>end; <br>end. <br><br> <br>来自: prog1, 时间: 2000-06-05 16:44:01, ID: 260552 &nbsp;<br>http://cjq.myrice.com/www2/myworks/myworks.htm <br> <br>来自: thtfsyh, 时间: 2000-07-21 20:12:31, ID: 289689 &nbsp;<br>g <br> <br>来自: 段荣誉, 时间: 2000-07-21 20:15:26, ID: 289696 &nbsp;<br>到http://duanry.yeah.net看看吧,我的主页。 <br> <br>来自: angelsoft, 时间: 2000-07-24 3:48:08, ID: 291724 &nbsp;<br>SPCOMM RS-232多线程控件例子: <br>现时DELPHI上有很多串行口控件,SPCOMM控件有Data Bits、Parity、 Stop Bits 等配置, <br>支持 Read/Write 时序控制 (Timing control)、ReadIntervalTimeout、WriteIntervalTimout <br>等 ,支持 DTR/DSR, RTS/CTS 硬件流程控置及 Xon/Xoff 软件流程控置,是目前比较完善 <br>的控件。 以下是一个用RS-232进行数据接收、显示的例子。必须将RS232的通信参数设置好 <br>才能正确接收数据。(Data Bits,Parity,Stop Bits,COM口参数) <br>unit Unit1; <br>interface <br>uses <br> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, <br> StdCtrls, SPComm; <br>type <br> TForm1 = class(TForm) <br> &nbsp; Comm1: TComm; <br> &nbsp; Memo1: TMemo; <br> &nbsp; procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer; <br> &nbsp; &nbsp; BufferLength: Word); <br> &nbsp; procedure FormCreate(Sender: TObject); <br> &nbsp; procedure FormClose(Sender: TObject; var Action: TCloseAction); <br> private <br> &nbsp; { Private declarations } <br> public <br> &nbsp; { Public declarations } <br> end; <br>var <br> Form1: TForm1; <br>implementation <br>{$R *.DFM} <br>procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; <br> BufferLength: Word); <br>var <br> &nbsp; s: &nbsp; string; <br>begin <br> &nbsp; SetLength(S, BufferLength); //接收RS232的数据并显示Memo1上。 <br> &nbsp; Move(Buffer^, PChar(S)^, BufferLength); <br> &nbsp; Memo1.Lines.Add(S); <br> &nbsp; Memo1.Invalidate; <br>end; <br>procedure TForm1.FormCreate(Sender: TObject); <br>begin <br> &nbsp;Comm1.startcomm;//创建窗体时,将comm1控件打开。 <br>end; <br>procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); <br>begin <br> &nbsp;comm1.StopComm;//关闭窗体时,将comm1控件关闭。 <br>end; <br>end. <br><br> <br>来自: zengr, 时间: 2000-07-24 9:03:17, ID: 291790 &nbsp;<br>http://www.chinaasp.com/delphi/中spcomm控件很好用! <br> <br>来自: 千中元, 时间: 2000-07-24 10:02:11, ID: 291860 &nbsp;<br>结束吧,都什么时候了 <br> <br>来自: lylyly, 时间: 2000-09-19 22:06:12, ID: 341961 &nbsp;<br>多人接受答案了。 <br> <br>得分大富翁: angelsoft-150,程云-150,
 
可以参考spcomm的源码,里面很详细。
 
我想了解一下如何读写16进制的数据,还请大家多帮忙啊
 
16进制?在电脑里都是阿,不管你是ascii还是二进制,都是以16进制表现的阿,没什么区别的,处理方式是一样的
 
如何实现基于ASP短信平台dll
 
procedure TForm1.SendHex(S: String);<br>var<br> &nbsp;s2:string;<br> &nbsp;buf1:array[0..50000] of char;<br> &nbsp;i:integer;<br>begin<br> &nbsp;s2:='';<br> &nbsp;for i:=1 to &nbsp;length(s) do<br> &nbsp;begin<br> &nbsp; &nbsp;if ((copy(s,i,1)&gt;='0') and (copy(s,i,1)&lt;='9'))or((copy(s,i,1)&gt;='a') and (copy(s,i,1)&lt;='f'))<br> &nbsp; &nbsp; &nbsp; &nbsp;or((copy(s,i,1)&gt;='A') and (copy(s,i,1)&lt;='F')) then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp;s2:=s2+copy(s,i,1);<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br> &nbsp;for i:=0 to (length(s2) div 2-1) do<br> &nbsp; &nbsp;buf1:=char(strtoint('$'+copy(s2,i*2+1,2)));<br> &nbsp;Comm1.WriteCommData(buf1,(length(s2) div 2));<br>end;<br><br><br>以上是发送十六进制的程序
 
谁能提供一个接收十六进制的例子呀,谢谢啦
 
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;<br> &nbsp;BufferLength: Word);<br> var<br><br>i:integer;<br> strReceive:string;<br>begin<br> &nbsp;strReceive:='';<br> &nbsp;move(buffer^,pchar(@rbuf)^,bufferlength);<br> &nbsp;for i:=1 to bufferlength do<br> &nbsp; &nbsp;strReceive:=strReceive+inttohex(rbuf,2)+' ';<br> &nbsp;strReceive:='接收:=&gt;'+strReceive+' &nbsp;';<br> &nbsp;memo2.lines.add(strReceive);<br> &nbsp;memo2.lines.add('');<br><br>end;<br>以上是接收部分
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
633
import
I
后退
顶部