COMMTIMEOUTS(串口通讯超时参数设置)

在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。 有两种超时:间隔超时和总超时。间隔超时是指在接收时两个字符之间的最大时延,总超时是指读写操作总共花费的最大时间。写操作只支持总超时,而读操作两种超时均支持。

  用COMMTIMEOUTS结构可以规定读/写操作的超时,该结构的定义为:
  typedef struct _COMMTIMEOUTS

      {
       DWORD ReadIntervalTimeout; // 读间隔超时。 接收时,两字符间最大的时延。
       DWORD ReadTotalTimeoutMultiplier; // 读时间系数。 读取每字节的超时。
       DWORD ReadTotalTimeoutConstant; // 读时间常量。 读串口数据的固定超时。
               // 总超时   =   ReadTotalTimeoutMultiplier   *   字节数   +   ReadTotalTimeoutConstant  
       DWORD WriteTotalTimeoutMultiplier; // 写时间系数。 写每字节的超时。
       DWORD WriteTotalTimeoutConstant; // 写时间常量。 写串口数据的固定超时。
               // 总超时   =     WriteTotalTimeoutMultiplier *   字节数   +     WriteTotalTimeoutConstant 
  } COMMTIMEOUTS,*LPCOMMTIMEOUTS;
        COMMTIMEOUTS结构的成员都以毫秒为单位


COMMTIMEOUTS   comTimeOut;    //   COMMTIMEOUTS对象 
SetCommTimeouts(handlePort_,&comTimeOut);  //   将超时参数写入设备控制
ReadIntervalTimeout:指定通讯线上两个字符到达的最大时延,以毫秒为单位。在ReadFile操作期间,时间周期从第一个字符接收到算起。如果收到的两个字符之间的间隔超过该值,ReadFile操作完毕并返回所有缓冲数据。如果ReadIntervalTimeout为0,则该值不起作用。如果值为MAXDWORD,   并且ReadTotalTimeoutConstant和ReadTotalTimeoutMultiplier两个值都为0,   则指定读操作携带已经收到的字符立即返回,即使没有收到任何字符。

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

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

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

如果在输入缓冲区中有任何字符,ReadFile 立即返回缓冲区中的内容。
如果在缓冲区中没有任何字符,ReadFile 将等待接收到一个字符并立即返回.
如果在ReadTotalTimeoutConstant指定的时间值内无任何字节返回,ReadFile超时.  

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于VS2015和C语言,你可以使用Windows API来进行串口通讯。下面是一个简单的示例代码,演示了如何打开串口、发送和接收数据。 ```c #include <stdio.h> #include <windows.h> int main() { HANDLE hCom; DCB dcb; COMMTIMEOUTS timeouts; DWORD bytesRead, bytesWritten; // 打开串口 hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hCom == INVALID_HANDLE_VALUE) { printf("无法打开串口\n"); return 1; } // 配置串口参数 dcb.DCBlength = sizeof(DCB); if (!GetCommState(hCom, &dcb)) { printf("获取串口状态失败\n"); CloseHandle(hCom); return 1; } dcb.BaudRate = CBR_9600; // 设置波特率为9600 dcb.ByteSize = 8; // 数据位为8位 dcb.Parity = NOPARITY; // 无奇偶校验 dcb.StopBits = ONESTOPBIT;// 停止位为1个 if (!SetCommState(hCom, &dcb)) { printf("设置串口状态失败\n"); CloseHandle(hCom); return 1; } // 设置读写超时时间 timeouts.ReadIntervalTimeout = 0; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.ReadTotalTimeoutConstant = 1000; timeouts.WriteTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 1000; if (!SetCommTimeouts(hCom, &timeouts)) { printf("设置串口超时时间失败\n"); CloseHandle(hCom); return 1; } // 发送数据 char sendData[] = "Hello, world!"; if (!WriteFile(hCom, sendData, sizeof(sendData), &bytesWritten, NULL)) { printf("发送数据失败\n"); CloseHandle(hCom); return 1; } // 接收数据 char recvData[100]; if (!ReadFile(hCom, recvData, sizeof(recvData), &bytesRead, NULL)) { printf("接收数据失败\n"); CloseHandle(hCom); return 1; } printf("接收到的数据:%s\n", recvData); // 关闭串口 CloseHandle(hCom); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值