COMMTIMEOUTS

COMMTIMEOUTS

COMMTIMEOUTS 结构体被用在SetCommTimeoutsGetCommTimeouts 函数中,以便设置和查询通讯设备的超时参数。这个参数决定 ReadFile , WriteFile , ReadFileEx , 和 WriteFileEx 操作设备的行为。

 

typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant; } COMMTIMEOUTS, *LPCOMMTIMEOUTS;
成员
ReadIntervalTimeout
在通讯过程中接收两个字符之间的最长超时时间,按毫秒计算。在 ReadFile操作,当接收到第一个字符时,开始一个计时周期。如果接收任意两个字符之间的时隔超过本限制, ReadFile操作将完成并返回任何已缓冲的数据。0代表本参数未设置。

如果设置为MAXDWORD, 并且ReadTotalTimeoutConstantReadTotalTimeoutMultiplier成员为0,代表读取操作立即返回那些已接收的数据,即使没有收到任何字符。(两个字符之间的接收间隔)

ReadTotalTimeoutMultiplier
乘数用于计算读取操作的总超时时间,按毫秒计算。对于每个读取操作,这个值将乘以要读取的字节数。(读取单个字符的最大超时)
ReadTotalTimeoutConstant
一个用于计算对于读取操作的总超时周期的常数,按毫秒计算。对每次读取操作,实际总超时时间为 ReadTotalTimeoutMultiplier 成员与请求的字节数年的乘积加此值。

ReadTotalTimeoutMultiplierReadTotalTimeoutConstant成员为0代表总读取总超时时间无效(读取所有字节的时间为ReadTotalTimeoutMultiplier*BytesToRead+ReadTotalTimeoutConstant)。

WriteTotalTimeoutMultiplier
乘数用来计算写操作的总超时周期,按毫秒计算。对每个写操作,这个值将乘以要写入的字节数。(写单个字符的最大超时)
WriteTotalTimeoutConstant
一个用于计算写入操作的总超时周期的常数,按毫秒计算。对于每一次写入操作,实际总超时时间为 WriteTotalTimeoutMultiplier 成员与要写入字节的乘积再加此值.

WriteTotalTimeoutMultiplierWriteTotalTimeoutConstant成员为0代表总写入时间无效(写入所有字节的时间为WriteTotalTimeoutMultiplier*BytesToWrite+WriteTotalTimeoutConstant)

备注

如果一个应用程序设置ReadIntervalTimeoutReadTotalTimeoutMultiplier为 MAXDWORD并且设置ReadTotalTimeoutConstant 为一个大于零且小于MAXDWORD的值, 在调用ReadFile时将会发生如下现象:

 

 

  • 如果在输入缓冲区中有任何字符,ReadFile 立即返回缓冲区中的内容。
  • 如果在缓冲区中没有任何字符,ReadFile 将等待接收到一个字符并立即返回.
  • 如果在ReadTotalTimeoutConstant指定的时间值内无任何字节返回,ReadFile超时.  
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RS485是一种串行通信协议,常用于长距离通信和抗干扰能力要求较高的系统中。Delphi是一种高级编程语言,可用于开发Windows应用程序。在Delphi中,可以通过串口组件来实现RS485通信。 以下是基本的Delphi代码示例,用于初始化串口和发送/接收数据: ```delphi uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } hCom: THandle; dcb: TDCB; commTimeouts: TCommTimeouts; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var port: string; begin port := 'COM1'; // 串口号 hCom := CreateFile(PChar(port), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if hCom = INVALID_HANDLE_VALUE then begin ShowMessage('Failed to open ' + port); Exit; end; FillChar(dcb, SizeOf(dcb), 0); GetCommState(hCom, dcb); dcb.BaudRate := 9600; // 波特率 dcb.ByteSize := 8; // 数据位 dcb.Parity := NOPARITY; // 校验位 dcb.StopBits := ONESTOPBIT; // 停止位 SetCommState(hCom, dcb); FillChar(commTimeouts, SizeOf(commTimeouts), 0); commTimeouts.ReadIntervalTimeout := MAXDWORD; commTimeouts.ReadTotalTimeoutMultiplier := MAXDWORD; commTimeouts.ReadTotalTimeoutConstant := 1000; SetCommTimeouts(hCom, commTimeouts); ShowMessage('COM1 is open'); end; procedure TForm1.Button2Click(Sender: TObject); var s: string; buf: array[0..255] of Char; len, n: Cardinal; begin s := 'Hello, world!'; len := Length(s); WriteFile(hCom, s[1], len, n, nil); ShowMessage('Sent ' + IntToStr(n) + ' bytes'); FillChar(buf, SizeOf(buf), 0); ReadFile(hCom, buf, 255, n, nil); SetString(s, buf, n); Memo1.Lines.Add(s); end; ``` 在上面的示例中,我们首先打开一个串口(COM1),然后配置其参数(波特率、数据位、校验位和停止位)。接下来,我们可以使用WriteFile函数向串口发送数据,使用ReadFile函数从串口接收数据。在这个例子中,我们发送了一个字符串“Hello, world!”,并在接收到数据后将其添加到Memo1中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值