通讯问题 (100分)

  • 主题发起人 主题发起人 qmwuu
  • 开始时间 开始时间
Q

qmwuu

Unregistered / Unconfirmed
GUEST, unregistred user!
本人调试串口通讯的时候,用comtools可以对串口进行正常的读取,但是在delphi中不知道如何设置。请教各位大虾。
 
1.用串口通讯控件.
2.用API函数
3.用汇编
 
你准备用什么组件呢?
建议你使用TApdComPort控件。

这是它的使用说明:
TApdComPort控件重要属性介绍:
1》AutoOpen属性
决定了端口是否按要求自动打开;如果为True,并且存取了一个要求具有打开串口的方法或属性,TApdComPort控件将自动打开串口,如果是False,端口必须明确的地开(通过设置Open属性为True).
2》TapiMode属性
决定TApdTapiDevice控件是否控制TApdComPort控件;TApdTapiDevice不能单独工作,它必须联合TApdComPort一起工作,当创建一个TApdTapiDevice时,它为TApdComPort查找窗体,如果它找到一个,它检查TApdComPort控件的TApiMode属性以决定TapdTapiDevice是否能使用它。
如果TApiMode是默认值tmAuto,TApdComPort控件对TAPI使用可用,TApdTapiDevice保存一个到TApdComPort的指针并设置如下属性值:
ApdComPort.TApiMode:=tmOn;
ApdComPort.AutoOpen:=False;
ApdComPort.Open:=False;
改变TApiMode是tmOn已表明关联的TApdTapiDevice正在控制TApdComPort.设置AutoOpen和Open为False,是因为当他被打开或者被关闭(TAPI正在使用)时,TApdComPort不能再控制。
为了关闭TApiMode模式,或防止TAPI设备控制TApdComPort,设置TApiMode为tmOff。为以后TAPI模式在使能,设置TApiMode为tmAuto或tmOn,还需设置AutoOpen和Open为False,因为仅当TApdTapiDevice或TApdComPort被首先创建时,TApdTapiDevice才自动设置这些属性。
tmNone值没被使用。
3》Tracing属性
Tracing属性决定了当前跟踪状态。
当Tracing属性设为tlOff(默认值),则不执行跟踪。
为使能跟踪功能,设置Tracing属性为tlOn。这分配一个2*TraceSize字节大小的内部缓冲区,通知调度器(dispatcher)开始用缓冲区。为使跟踪无效而不用写缓冲区的内容到磁盘文件,设置Tracing属性为tlOff。这样就释放了内部的缓冲区。
为了写跟踪缓冲区的内容到磁盘,设置Tracing属性为tlDump(重写命名为TraceName的文件,或创建一个新文件)或tlAppend(附加到一个已有文件或创建一个新文件)。控件写内容到文件后,设置Tracing属性为tlOff。
为清除跟踪缓冲区内容并继续跟踪,设置Tracing属性为tlClear。控件清除跟踪缓冲区后,设置Tracing属性为tlOn。
为了临时暂停跟踪,设置Tracing属性为tlpause。如果要恢复跟踪,设置Tracing属性为tlOn.
下面例子首先开启Tracing,然后转储(Dump)跟踪缓冲区到APRO.TRC。
ApdComPoert.Tracing:=tlOn;
......
ApdComPort.TraceName:='APRO.TRC';
ApdComPort.Tracing:=tlDump;
...
4》Logging属性
Logging属性决定当前日志状态。
当Logging属性设为tlOff(默认值),没有执行日志功能。
为了使能日志,设置Logging属性为tlOn。这分配一个LogSize字节大小的内部缓冲区并通知调度器去开始用这个缓冲区。为了不将日志缓冲区的内容写到磁盘文件,设置Logging属性为tlOff。这样也释放了内部缓冲区。
为了将日志缓冲区的内容写到磁盘,设置Logging属性为tlDump或tlAppend。控件写文件之后,设置Logging属性为tiOff。
为了清除缓冲区的内容并继续使用日志,设置Logging属性为tlClear。控件清除缓冲区之后,设置Logging属性为tlOn。
为临时暂停日志,设置Logging属性为tlPause。为了恢复日志功能,设置Logging属性为tlOn。例:
ApdComPort.Logging:=tlOn;
...
ApdComPort.LogName:='APRO.LOG';
ApdComPort.Logging:=tlDump;
*****************************************
5》DTR属性
DTR属性决定当前“Data Terminal Ready”信号(DTR)的状态。
下面例子表明在打开端口之后,降低DTR信号,其后升高DTR信号。
ApdComPort:=TApdComPort.Create(Self);
ApdComPort.Open:=True;
ApdComPort.DTR:=True;
ApdComPort.DTR:=False;
...
ApdComPort.DTR:=True;
**********************************
6》ComNumber属性
ComNumber决定了TApdComPort控件使用的串口号(Com1、Com2、...).
ComNumber并不验证串口号的有效性。当打开端口时,Windows通讯驱动程序将决定串口是否有效,如果无效,则出错。
当改变ComNumber的属性时,如果端口打开,关闭已有的端口,用新串口号重新打开。在这个操作中,维持Trigger(触发器).
当使用TAPI和Winsock设备层(Device Layer)时,这个属性被忽略。
下面例子在运行期间创建、配置、打开一个ComPort控件
ApdComPort:=TApdComPort.Create(Self);
ApdComPort.ComNumber:=1;
ApdComPort.Baud:=9600;
ApdComPOrt.Parity:=pNone;
ApdComPort.DataBits:=8;
ApdComPort.StopBits:=1;
ApdComPort.Open:=True;
*********************************
7》Open属性
决定是否打开端口,是否用当前的所有属性初始化该端口。
当Open属性设置为True时,TApdComPort控件将用所有当前属性设置来分配输入和输出缓冲区,打开物理端口,初始化线路设置(Line Setting)和流量控制(Flow Control)设置,并使Tracing和Logging有效或无效。然后为低级端口注册一个Trigger,其首先查看所有Trigger事件,并将控制传递给适当的OnTriggerXxx事件处理器。
当Open属性设为False时,TApdComPort将关闭Tracing和Logging(通过设置相关的属性为tlDump,如果已经缓冲了信息,它将创建一个输出文件),关闭端口,重新分配输入和输出缓冲区。
当Open属性已经为True时,设置Open属性为True是无害的;反之亦然。
*************************************************
8》StopBits属性
决定端口的停止位的个数,可接受的值为1和2。如果DataBits等于5,一个请求2个停止位被解释为一个请求1.5个停止位。
当改变StopBits属性时,如果端口已打开,线路参数立即更新。在把StopBit属性传递给通信驱动程序之前,StopBits不校验所赋予的值,驱动程序可能拒绝这个值,并将导致一个异常。异常:EBadArgument、EBadHandle。
****************************************************
9》DataBits属性
决定端口的数据位的个数。可接受值是:5、6、7、8。
当改变DataBits属性时,如果端口已打开,线路参数立即更新。把DataBit属性传递给通信驱动程序之前,DataBits不校验所赋予的值,驱动程序可能拒绝这个值,并将导致一个异常。异常:ENotSupported.
*****************************************
10》Parity属性
决定端口的奇偶校验模式。
当Parity被改变时,如果端口已打开,线路参数立即更新。把Parity属性传递给通信驱动程序之前,Parity不校验所赋予的值,驱动程序可能拒绝这个值,并将导致一个异常。异常:EBadHandle、ENotSupported.
************************************************
11》Baud属性
Baud属性决定端口使用的波特率。
通常可接受的波特率值包括:300、1200、2400、4800、9600、19200、38400、57600、115200。
当波特率被改变时,如果端口已打开,线路参数立即更新。把Baud属性传递给通信驱动程序之前,Baud不校验所赋予的值,驱动程序可能拒绝这个值,并将导致一个异常。异常:ENotSupported.
用对象观察器输入一个波特率或调用SelectBaudRate属性编辑器,其提供了一个标准的下拉框。
12》OnConnectionStatus事件
当Modem状态改变时,OnConnectionStatus定义了调用的事件处理器。
这个事件处理所有TApdSModem状态改变。下面Modem状态将触发OnConnectionStatus事件:
smsReady 空闲并就绪
smsInitialize 开始初始化进程
smsInitializeTimeout 等待初始化响应超时
smsAutoAnswerBackground autoanswer模式,没振铃接收
smsAutoAnswerWait autoanswer模式,等待第N个铃声
smsAnswerWait 回应呼叫,等待连接
smsDialWait 拨号呼叫,等待连接
smsDialCycle 重试拨号尝试的时间
smsNoDialTone 当拨号尝试时,Modem报告没有拨号音码
smsConnected 处理连接过程
smsHangup 开始挂断过程
smsCancel 开始取消过程
在OnConnectionStatus事件处理器,用TApdSModemStatusInfo类的方法来获取Modem状态和那个情况的合适的状态信息。
 
哦,对了。可以在这里下载:
http://www.51delphi.com/delphi/soft?type=通信
在TurboPower Async Prof 4.05 中
 
我现在用的是SPCOM控件,不知道那位大虾了解。
 
或者用API自己写。
 
我觉得用API或是控件不是关键,而根据硬件特点来设计程序才是关键所在。
 
你用SPCOM存在什么问题呢???
 
同意楼上的[8D]
 
与硬件通讯没有反应。
 
用spcomm的话你看它的源代码就可以了。上面有很详细的说明,我当初就是这样做的。
不过是E文的!我都是对着词霸
 
你的通讯协议对不对呀???
 
通讯协议怎么写?
 
spcomm读取数据没有问题呀,我在出差,相关的资料没有带,回去后,你如果需要,我发给你
 
spcomm发送命令后,我如何判断超时?
 
超时判断
利用Timer控件,发送数据后,Timer.enable :=true;
Timer的超时时间自己来定,比如2000(2秒钟),发送数据后接收返回信息,如果在两妙钟内没有收到信息,Timer的Ontimer事件就会执行,在这个事件里面处理超时
如果两秒钟内收到了返回信息,就把Timer的Enable 设置为False,不会执行OnTimer事件
 
后退
顶部