Delphi 7 Spcomm
插拔串口后,不传数据,必需开关
软件后才可正常传输
问题的解决办法 办法如下: 设置为相应数值, 设置为零, 如果 ReadIntervalTimeout 设置为相应数值,ReadTotalTimeoutMultiplier 设置为零,就可以避 免插拔后数据不能正常传输 原因如下: Spcomm 属性含意 如果想读写可靠,要根据 不同的速率和应用实际情况设置合适的值。和同步模式和异步模 式、不同的
通信协议无关。 COMMTIMEOUTS:COMMTIMEOUTS 主要用于串口超时参数设置。COMMTIMEOUTS 结构如下: typedef struct _COMMTIMEOUTS { DWORD ReadIntervalTimeout; DWORD ReadTotalTimeoutMultiplier; DWORD ReadTotalTimeoutConstant; DWORD WriteTotalTimeoutMultiplier; DWORD WriteTotalTimeoutConstant; } COMMTIMEOUTS,*LPCOMMTIMEOUTS;
1
ReadIntervalTimeout:两字符之间最大的延时 : 注:当读取串口数据时,一旦两个字符传输的时间差超过该时间,读取函数将返回现有的 数据。设置为 0 表示该参数不起作用。指定时间最大值(毫秒) ,充许接收的 2 个字节间有 时间差。也就 是说,刚接收了一个字节后,等了 ReadIntervalTimeout 时间后还没有新的字 节到达,就认为本次读串口操作结束(后面的字节等下一次读取操作来处理) 后面的字节等下一次读取操作来处理) 。即使你想读 8 个字节,但读第 2 个字节后,过了 ReadIntervalTimeout 时间后,第 3 个字节还没到。实 际上就只读了 2 个字节。
2
ReadTotalTimeoutMultiplier:指定比例因子(毫秒) ,实际上是设置读取一个字节和等待 下一个字节所需的时间,这样总的超时时间为读取的字节数乘以该值,同样一次读取操作 到达这个时间后,也认为本次读操作己经结束。
3
ReadTotalTimeoutConstant: 一次读取串口数据的固定超时。 所以在一次读取串口的操作中, 其 超 时 为 ReadTotalTimeoutMultiplier 乘 以 读 取 的 字 节 数 再 加 上
ReadTotalTimeoutConstant 。 将 ReadIntervalTimeout 设 置 为 MAXDWORD , 并 将 ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 设置为 0,表示读取操作将立即 返回存放在输入缓冲区的字符。可以理解为一个修正时间,实际上就是按 ReadTotalTimeoutMultiplier 计算出的超时时间再加上该时间才作为整个超时时间。
4 5
WriteTotalTimeoutMultiplier:写入每字符间的超时。 WriteTotalTimeoutConstant: 一次写入串口数据的固定超时。 所以在一次写入串口的操作中, 其 超 时 为 WriteTotalTimeoutMultiplier 乘 以 写 入 的 字 节 数 再 加 上 WriteTotalTimeoutConstant。
6
一般都会做以下设置:
-_-
TimeOuts.ReadIntervalTimeout=MAXDWORD; // 把间隔超时设为最大,把总超时设为 0 将导致 ReadFile 立即返回并完成操作 TimeOuts.ReadTotalTimeoutMultiplier=0; //读时间系数 TimeOuts.ReadTotalTimeout
Constant=0; //读时间常量 TimeOuts.WriteTotalTimeoutMultiplier=50; //总超时=时间系数*要求读/写的字符数+时间常量 TimeOuts.WriteTotalTimeoutConstant=2000; //设置写超时以指定 WriteComm 成员函数中的
-_-
-_-
-_-
-_-