精华内容
下载资源
问答
  • 我正在使用PySerial从串口读取,如下面的代码所示.CheckReadUntil()读取我发送到串行端口的命令的输出,直到符号序列readUntil在串行输出中....self.ser = serial.Serial(comDev, 115200, timeout=10)...#Function ...

    我正在使用PySerial从串口读取,如下面的代码所示.

    CheckReadUntil()读取我发送到串行端口的命令的输出,直到符号序列readUntil在串行输出中.

    ...

    self.ser = serial.Serial(comDev, 115200, timeout=10)

    ...

    #Function that continue to read from Serial port until 'readUntil'

    #sequence of symbols appears

    def CheckReadUntil(self, readUntil):

    outputCharacters = []

    while 1:

    ch = self.ser.read()

    outputCharacters += ch

    if outputCharacters[-len(readUntil):]==readUntil:

    break

    outputLines = ''.join(outputCharacters)

    return outputLines

    但是,如果没有序列readUntil(由于任何原因),我只是永远停留在函数CheckReadUntil()中.设置超时= 10设置超时,所以我陷入了一个循环,每10秒迭代一次,什么都不做,只是等待.

    怎么可能理解有一个超时事件所以我可以退出无限循环?输出长度可能不同.

    展开全文
  • 读写超时是在 调用 ReadFile和 WriteFile函数读写串口的时候系统提供的超时机制typedef struct _COMMTIMEOUTS {DWORD ReadIntervalTimeout; /* Maximum time between read chars. */DWORD ...

    读写超时是在   调用  ReadFile和  WriteFile函数读写串口的时候系统提供的超时机制

    typedef struct _COMMTIMEOUTS {

    DWORD ReadIntervalTimeout; /* Maximum time between read chars. */

    DWORD ReadTotalTimeoutMultiplier; /* Multiplier of characters. */

    DWORD ReadTotalTimeoutConstant; /* Constant in milliseconds. */

    DWORD WriteTotalTimeoutMultiplier; /* Multiplier of characters. */

    DWORD WriteTotalTimeoutConstant; /* Constant in milliseconds. */

    } COMMTIMEOUTS,*LPCOMMTIMEOUTS;

    读超时 有两只计算方法

    1:(间隔超时)ReadIntervalTimeout 指定了在接收字符间的最大时间,如果超过了这个时间,ReadFile立即返回。

    2:(总超时)基于要接收的字符数量

    ReadTotalTimeoutMultiplier表示平均读一个字节的时间上限

    ReadTotalTimeoutConstant表示读数据总时间常量

    读数据总超时:ReadTotalTimeoutConstant +(ReadTotalTimeoutMultiplier*要读的字节数)

    读数据超时,两种超时同时有效,当出现任何一种超时时,ReadFile都将返回。

    写超时:

    WriteTotalTimeoutMultiplier表示平均写一个字节的时间上限

    WriteTotalTimeoutConstant表示写数据总超时常量

    写数据总超时 :WriteTotalTimeoutConstatn +(WriteTotalTimeoutMultiplier *要写的字节数)

    具体超时设置

    1:有读间隔超时、读总超时、写总超时,将COMMTIMEOUTS结构5个成员设置为对应值。

    2:没有读间隔超时,有读总超时和写总超时,将RealIntervalTimeou设置为0,其他参数设置为对应值。

    3:不管是否有数据要读取,ReadFile立即返回,将RealIntervalTimeout设置为MAX_DWORD,

    将ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都设置为0

    (不立即返回的时候,可以在超时时间内等串口中有新的数据?然后读取,直到超时时间)

    4:ReadFile没有超时设置,直到有适当的字符数返回或者错误发生,函数才返回。

    将 ReadIntervalTimeout、ReadTotalTimeoutMultiplier、ReadTotalTimeoutConstant都设置为0

    5:WriteFile没有超时设置:将WriteTotalTimeoutMultiplier和WriteTotalTimeoutConstant设置为0

    展开全文
  • 串口超时

    千次阅读 2013-09-13 15:43:41
    因此,在超时发生后,WaitForSingleObject和GetOverlappedResult都会结束等待。WaitForSingleObject的dwMilliseconds参数会规定一个等待超时,该函数实际等待的时间是两个超时的最小值。注意GetOverlappedResult不能...
    Win 32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的声明为: 

    HANDLE CreateFile(

    LPCTSTR lpFileName, // 文件名

    DWORD dwDesiredAccess, // 访问模式

    DWORD dwShareMode, // 共享模式

    LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 通常为NULL

    DWORD dwCreationDistribution, // 创建方式

    DWORD dwFlagsAndAttributes, // 文件属性和标志

    HANDLE hTemplateFile // 临时文件的句柄,通常为NULL

    );

      如果调用成功,那么该函数返回文件的句柄,如果调用失败,则函数返回INVALID_HANDLE_VALUE。

     
        在打开通信设备句柄后,常常需要对串行口进行一些初始化工作。这需要通过一个DCB结构来进行。DCB结构包含了诸如波特率、每个字符的数据位数、奇偶校验和停止位数等信息。在查询或配置置串行口的属性时,都要用DCB结构来作为缓冲区。

      调用GetCommState函数可以获得串口的配置,该函数把当前配置填充到一个DCB结构中。一般在用CreateFile打开串行口后,可以调用GetCommState函数来获取串行口的初始配置。要修改串行口的配置,应该先修改DCB结构,然后再调用SetCommState函数用指定的DCB结构来设置串行口。

      除了在DCB中的设置外,程序一般还需要设置I/O缓冲区的大小和超时。Windows用I/O缓冲区来暂存串行口输入和输出的数据,如果通信的速率较高,则应该设置较大的缓冲区。调用SetupComm函数可以设置串行口的输入和输出缓冲区的大小。

      在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。

      有两种超时:间隔超时和总超时。间隔超时是指在接收时两个字符之间的最大时延,总超时是指读写操作总共花费的最大时间。写操作只支持总超时,而读操作两种超时均支持。用COMMTIMEOUTS结构可以规定读/写操作的超时,该结构的定义为:

    typedef struct _COMMTIMEOUTS {

    DWORD ReadIntervalTimeout; // 读间隔超时

    DWORD ReadTotalTimeoutMultiplier; // 读时间系数

    DWORD ReadTotalTimeoutConstant; // 读时间常量

    DWORD WriteTotalTimeoutMultiplier; // 写时间系数

    DWORD WriteTotalTimeoutConstant; // 写时间常量

    } COMMTIMEOUTS,*LPCOMMTIMEOUTS;

      COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:

    总超时=时间系数×要求读/写的字符数 + 时间常量

      例如,如果要读入10个字符,那么读操作的总超时的计算公式为:

    读总超时=ReadTotalTimeoutMultiplier×10 + ReadTotalTimeoutConstant

      可以看出,间隔超时和总超时的设置是不相关的,这可以方便通信程序灵活地设置各种超时。

      如果所有写超时参数均为0,那么就不使用写超时。如果ReadIntervalTimeout为0,那么就不使用读间隔超时,如果ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都为0,则不使用读总超时。如果读间隔超时被设置成MAXDWORD并且两个读总超时为0,那么在读一次输入缓冲区中的内容后读操作就立即完成,而不管是否读入了要求的字符。

      在用重叠方式读写串行口时,虽然ReadFile和WriteFile在完成操作以前就可能返回,但超时仍然是起作用的。在这种情况下,超时规定的是操作的完成时间,而不是ReadFile和WriteFile的返回时间。
    在用ReadFile和WriteFile读写串行口时,既可以同步执行,也可以重叠(异步)执行。在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。在重叠执行时,即使操作还未完成,调用的函数也会立即返回。费时的I/O操作在后台进行,这样线程就可以干别的事情。例如,线程可以在不同的句柄上同时执行I/O操作,甚至可以在同一句柄上同时进行读写操作。“重叠”一词的含义就在于此。

      ReadFile函数只要在串行口输入缓冲区中读入指定数量的字符,就算完成操作。而WriteFile函数不但要把指定数量的字符拷入到输出缓冲中,而且要等这些字符从串行口送出去后才算完成操作。

      ReadFile和WriteFile函数是否为执行重叠操作是由CreateFile函数决定的。如果在调用CreateFile创建句柄时指定了FILE_FLAG_OVERLAPPED标志,那么调用ReadFile和WriteFile对该句柄进行的读写操作就是重叠的,如果未指定重叠标志,则读写操作是同步的。

      函数ReadFile和WriteFile的参数和返回值很相似。这里仅列出ReadFile函数的声明:

    BOOL ReadFile(

    HANDLE hFile, // 文件句柄

    LPVOID lpBuffer, // 读缓冲区

    DWORD nNumberOfBytesToRead, // 要求读入的字节数

    LPDWORD lpNumberOfBytesRead, // 实际读入的字节数

    LPOVERLAPPED lpOverlapped // 指向一个OVERLAPPED结构

    ); //若返回TRUE则表明操作成功

     

      需要注意的是如果该函数因为超时而返回,那么返回值是TRUE。参数lpOverlapped在重叠操作时应该指向一个OVERLAPPED结构,如果该参数为NULL,那么函数将进行同步操作,而不管句柄是否是由FILE_FLAG_OVERLAPPED标志建立的。

      当ReadFile和WriteFile返回FALSE时,不一定就是操作失败,线程应该调用GetLastError函数分析返回的结果。例如,在重叠操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING。

      在使用重叠I/O时,线程需要创建OVERLAPPED结构以供读写函数使用。OVERLAPPED结构最重要的成员是hEvent,hEvent是一个事件对象句柄,线程应该用CreateEvent函数为hEvent成员创建一个手工重置事件,hEvent成员将作为线程的同步对象使用。如果读写函数未完成操作就返回,就那么把hEvent成员设置成无信号的。操作完成后(包括超时),hEvent会变成有信号的。

      如果GetLastError函数返回ERROR_IO_PENDING,则说明重叠操作还为完成,线程可以等待操作完成。有两种等待办法:一种办法是用象WaitForSingleObject这样的等待函数来等待OVERLAPPED结构的hEvent成员,可以规定等待的时间,在等待函数返回后,调用GetOverlappedResult。另一种办法是调用GetOverlappedResult函数等待,如果指定该函数的bWait参数为TRUE,那么该函数将等待OVERLAPPED结构的hEvent 事件。GetOverlappedResult可以返回一个OVERLAPPED结构来报告包括实际传输字节在内的重叠操作结果。

      如果规定了读/写操作的超时,那么当超过规定时间后,hEvent成员会变成有信号的。因此,在超时发生后,WaitForSingleObject和GetOverlappedResult都会结束等待。WaitForSingleObject的dwMilliseconds参数会规定一个等待超时,该函数实际等待的时间是两个超时的最小值。注意GetOverlappedResult不能设置等待的时限,因此如果hEvent成员无信号,则该函数将一直等待下去。

      在调用ReadFile和WriteFile之前,线程应该调用ClearCommError函数清除错误标志。该函数负责报告指定的错误和设备的当前状态。

      调用PurgeComm函数可以终止正在进行的读写操作,该函数还会清除输入或输出缓冲区中的内容。

    展开全文
  • 读写串口超时机制

    千次阅读 2013-11-12 13:29:52
    读写超时是在 调用 ReadFile 和 WriteFile 函数读写串口的时候系统提供的超时机制 typedef struct _COMMTIMEOUTS {  DWORD ReadIntervalTimeout; /* Maximum time between read chars. */  ...

    读写超时是在   调用  ReadFile 和  WriteFile   函数读写串口的时候系统提供的超时机制

    typedef struct _COMMTIMEOUTS {
        DWORD ReadIntervalTimeout;          /* Maximum time between read chars. */
        DWORD ReadTotalTimeoutMultiplier;   /* Multiplier of characters.        */
        DWORD ReadTotalTimeoutConstant;     /* Constant in milliseconds.        */
        DWORD WriteTotalTimeoutMultiplier;  /* Multiplier of characters.        */
        DWORD WriteTotalTimeoutConstant;    /* Constant in milliseconds.        */
    } COMMTIMEOUTS,*LPCOMMTIMEOUTS;

      


    读超时 有俩计算方法

    1:(间隔超时)ReadIntervalTimeout 指定了在接收字符间的最大时间,如果超过了这个时间,ReadFile立即返回。

    2:(总超时)基于要接收的字符数量

    ReadTotalTimeoutMultiplier表示平均读一个字节的时间上限

    ReadTotalTimeoutConstant表示读数据总时间常量

    读数据总超时:ReadTotalTimeoutConstant +(ReadTotalTimeoutMultiplier*要读的字节数)

    读数据超时,两种超时同时有效,当出现任何一种超时时,ReadFile都将返回。

    写超时:

    WriteTotalTimeoutMultiplier表示平均写一个字节的时间上限

    WriteTotalTimeoutConstant表示写数据总超时常量

    写数据总超时 :WriteTotalTimeoutConstatn +(WriteTotalTimeoutMultiplier *要写的字节数)

    具体超时设置

    1: 有读间隔超时、读总超时、写总超时,将COMMTIMEOUTS结构5个成员设置为对应值。

    2:没有读间隔超时,有读总超时和写总超时,将RealIntervalTimeou设置为0,其他参数设置为对应值。

    3:不管是否有数据要读取,ReadFile立即返回,将RealIntervalTimeout设置为MAX_DWORD,

    将ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都设置为0

    (不立即返回的时候,可以在超时时间内等串口中有新的数据?然后读取,直到超时时间)

    4:ReadFile没有超时设置,直到有适当的字符数返回或者错误发生,函数才返回。

    将 ReadIntervalTimeout、ReadTotalTimeoutMultiplier、ReadTotalTimeoutConstant都设置为0

    5:WriteFile没有超时设置:将WriteTotalTimeoutMultiplier和WriteTotalTimeoutConstant设置为0

    展开全文
  • C#串口超时

    千次阅读 2012-07-13 10:28:27
    C#在读写时,有可能超时,微软为我们...可以将超时值设置为大于零的任意值,或设置为 InfiniteTimeout,在后一种情况下不会发生超时。InfiniteTimeout 为默认值。 代码如下: _serialPort.ReadTimeout = 500;
  • COMMTIMEOUTS 结构体被用在SetCommTimeouts和GetCommTimeouts 函数中,以便设置和查询通讯设备的超时参数。这个参数决定ReadFile, WriteFile, ReadFileEx, 和WriteFileEx 操作设备的行为。   typedef struct...
  • 在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。要查询当前的超时设置应调用GetCommTimeouts函数,该函数会...
  • ReadFile 和 WriteFile函数读写串口超时机制读写超时是在调用ReadFile 和WriteFile函数读写串口的时候系统提供的超时机制typedef struct _COMMTIMEOUTS {DWORDReadIntervalTimeout;DWORDReadTotalTimeoutMultiplier;...
  • “System.TimeoutException”类型的未经处理的异常在 System.dll 中发生 其他信息: 操作已超时。 二、超时原因及其解决办法  超时原因,是因为使用了SerialPort.ReadTimeout 方法和 SerialPortObj.ReadLine()...
  • android串口通讯

    千次阅读 2018-07-20 17:44:24
    在google的demo中,只是使用的c语音去打开串口,操作串口读取数据还是使用java 的IO流进行读取,IO流在read的时候是没有超时处理的,所有会造成串口卡住。 最新从新用jni使用c重新写了串口调用,因为是用c取里的...
  • “System.TimeoutException”类型的未经处理的异常在 System.dll 中发生 其他信息: 操作已超时。 二、超时原因及其解决办法  超时原因,是因为使用了SerialPort.ReadTimeout 方法和 SerialPortObj.ReadLine...
  • 总是提示我“芯片超时无应答 无法连接” 下面列出我的解决方法: 1、软件设置:我使用的是之前常用的FlyMcu烧录软件,需要注意的几个点是: (1)当提示“无法打开串口Com0. No This comport Or In using!”,...
  • 主控stm32f030c8t6芯片,采用stm32CubeMX软件生成代码,由于没有串口空闲中断接收,经过编程已加上了这个功能,供嵌入式同行借鉴使用。
  • 文章目录 1 自定义帧格式 1.1 数据帧结构 1.2 填充数据帧 1.3 填充数发送缓冲区 1.4 通过串口发送数据 2 超时接收 2.1 串口中断服务程序 2.2 定时器中断服务函数: 2.3 数据处理 1 自定义帧格式 1.1 数据帧结构 定义...
  • 1 使用定时器判断这种方式建立在两帧数据不可能连续发送的基础上,也是modbus判断帧结束的方式,在接收到第一个字节的时候打开定时器,如果继续接收到数据则更新定时器,在被设定时间内没有接收到数据则定时器超时。...
  • 之前在做项目的时候,串口接收的数据要及时进行处理,虽然采用了自定义的串口协议,但是协议的包尾只有一个字节,经常判断不准数据是否接受完毕,所以就采用计时器+串口的方式来判定串口是否接受完成。 核心思想 ...
  • 单片机串口接收发生溢出中断错误

    千次阅读 2021-12-30 14:22:52
    最近在写国产华大单片机HC32F4A0的串口超时中断加DMA接收数据过程中发现一个问题,在我串口收到数据进入串口超时中断后,正常情况下,如果数据量没超过DMA设定的发送次数最大情况,是能接收数据的,但是一旦接收超过...
  • 在进行PID参数整定的工作过程中,我需要将电机的转速、扭矩、母线电压、母线电流、相电压、相电流等参数通过串口传递到电脑上用Matlab来进行BP神经网络算法的PID整定计算,再将计算得到的PID参数传给电机的驱动板,...
  • STM32 hal库解决串口+DMA接收数据

    千次阅读 2021-02-27 19:36:40
    STM32F407串口空闲中断+DMA 接收,应用于大疆DT7无线遥控 #stm32CubeIDE STM32F4 HAL库 大疆DT7 串口+DMA () 1.硬件设计 首先了解大疆接收器发送串口数据的信号类型 如图可知,需要做一个取反电路…如下图: 图片取自...
  • MATLAB串口操作

    2021-07-24 17:51:09
    串口操作的整个流程: 建立串口对象–使用serial创建函数对一个特定的串口创建对象(可能要配置一些属性,如波特率、数据位数等) 对设备进行连接–使用fopen函数来实现串口对象与设备的连接。 配置属性–使用set或者...
  • ZYNQ基础----串口中断

    千次阅读 2020-07-03 10:40:52
      在ZYNQ中,串口一般作为打印信息,若想利用串口来传输数据时,可以对串口进行配置。本篇博客介绍串口的中断模式。 串口初始化流程 序号 流程 函数 1 查找GPIO配置结构体 ...设置接收超时时间 XU
  • 串口通信编程

    2021-07-18 20:23:45
    串口通信学习笔记
  • C#串口读取

    2021-09-03 08:41:43
    串口SerialPort类using System.IO.Ports;SerialPort常用属性SerialPort的主要方法串口使用串口使用需要一些相关设置:打开和关闭串口DataReceived using System.IO.Ports; 此类位于System.IO.Ports命名空间下。用于...
  • 串口通信的帧同步问题

    千次阅读 2015-10-31 17:32:28
    封装STM32串口的底层时,遇到了串口帧同步的问题。虽然以前也遇到类似场合,写出来的代码基本能够解决问题,但是在逻辑上总是不能彻底的解释一些细节。 讲一下当前的需求: 由于代码想用在一个简单的PID闭环上,做...
  • ---------------------------------------------------------- Remark: (备注描述) 给串口2的接收提供定时,再一次中断内(1ms)接收数据的长度不变则认为接收 完成。 --------------------------------------------...
  • 比zlg串口中间件好的UART串口驱动(带超时的同步操作) 引言 以下的串口驱动是我在一个产品中实现了的,其特点: 一、支持FIFO,系统开销小,中断少 二、在多任务操作系统里使用串口很简单,对串口操作就4个:打开...
  • stm32串口实验一、实验前准备二、具体项目代码项目1:printf重定向实验,轮询方式通信重定向:轮询方式:中断方式:项目2:中断方式的串口通信相关中断函数: 一、实验前准备 完成过基于cubemx和MDK-ARM的点灯实验...
  • 树莓派串口详解

    千次阅读 2020-05-30 17:06:46
    之前为了使用树莓派的GPIO串口功能,搜了各种解决方案,最终在官方文档里面找到了正确的方法。前面一篇简单三步搞定树莓派GPIO串口通讯描述了如何快速配置好GPIO串口,但没有写为什么这么配置,本篇就根据官方串口...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,288
精华内容 2,915
关键字:

串口超时发生