精华内容
下载资源
问答
  • 简单的串口接收超时函数 类似于select 函数。 设置的超时时间,若在规定的时间内接收到数据,则返回0(接收成功);否则返回-1 适用场景: 给一块设备发送信息,能够立马收到响应信息。 /***********************...

    简单的串口接收超时函数

    类似于select 函数。
    设置的超时时间,若在规定的时间内接收到数据,则返回0(接收成功);否则返回-1

    适用场景:
    给一块设备发送信息,能够立马收到响应信息。

    /*************************************************************************
      * @函数名称    SerialKeyPressed
      * @函数说明   测试超级终端是否有按键按下
      * @输入参数   key:按键
      * @输出参数   无
      * @返回参数   1:正确
                    0:错误
    **************************************************************************/
    uint32_t SerialKeyPressed(uint8_t *key)
    {

        if ( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
        {
            *key = (uint8_t)USART1->DR;
            return 1;
        }
        else
        {
            return 0;
        }
    }


    /************************************************************************
      * @函数名称    Receive_Byte
      * @函数说明   从发送端接收一个字节
      * @输入参数   c: 接收字符
                    timeout: 超时时间
      * @输出参数   无
      * @返回参数   接收的结果
                    0:成功接收
                   -1:时间超时
    *************************************************************************/
    static  int32_t Receive_Byte (uint8_t *c, uint32_t timeout)
    {
        while (timeout-- > 0)
        {
            if (SerialKeyPressed(c) == 1)
            {
                return 0;
            }
        }
        return -1;
    }

     

    展开全文
  • ReadFile 和 WriteFile函数读写串口超时机制读写超时是在调用ReadFile 和WriteFile函数读写串口的时候系统提供的超时机制typedef struct _COMMTIMEOUTS {DWORDReadIntervalTimeout;DWORDReadTotalTimeoutMultiplier;...

    ReadFile 和 WriteFile

    函数读写串口超时机制

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

    typedef struct _COMMTIMEOUTS {

    DWORD

    ReadIntervalTimeout; DWORD

    ReadTotalTimeoutMultiplier; DWORD

    ReadTotalTimeoutConstant; DWORD

    WriteTotalTimeoutMultiplier; DWORD

    WriteTotalTimeoutConstant; } 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
    无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的声明为: HANDLE CreateFile( LPCTSTR lpFileName, // 文件名 DWORD dwDesiredAccess, /...
    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函数可以终止正在进行的读写操作,该函数还会清除输入或输出缓冲区中的内容。

    展开全文
  • 单片机串口超时接收机制

    千次阅读 2019-03-06 14:25:17
    在使用单片机的时候串口是与外界通讯最常用的一种方法 在处理接收的时候超时处理是一种常见的方法。...//串口0 中断函数 void UART0_Isr() interrupt 4 using 1 { if (TI) { busy0 = 0; TI = 0; ...

    在使用单片机的时候串口是与外界通讯最常用的一种方法

    在处理接收的时候超时处理是一种常见的方法。

    参考代码如下:

    //串口0 中断函数
    void UART0_Isr() interrupt 4 using 1
    {
        if (TI)
        {
              busy0 = 0;
              TI    = 0;                                 //清中断标志 TX
        }
        if (RI)
        { 
                RI=0;                                      //清中断标志 RX
                UartRebuff0[UartReIndex0] = SBUF;
                if(++UartReIndex0>UARTMAX0) UartReIndex0=0;
                RxWaitTime0 = 5;
        }
    }

    其中变量RxWaitTime0 = 5; 在中断定时器里面不断计数,达到超时一定的时候,这个时候可以处理串口缓存的数据。

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

    千次阅读 2013-11-12 13:29:52
    读写超时是在 调用 ReadFile 和 WriteFile 函数读写串口的时候系统提供的超时机制 typedef struct _COMMTIMEOUTS {  DWORD ReadIntervalTimeout; /* Maximum time between read chars. */  ...
  • usart.c串口中断处理函数: u8 USART_RX_BUF[64]; //接收缓冲,最大64个字节. u8 res=0; u8 i=0,Rec_Len; //Rec_Len为接收到的字符个数 u8 Rec_Over_Flag=0; u8 RxTimeout=3; //串口接收超时; void USART1_...
  • 问题:项目需要在android面板上开发485串口通信,读的命令发送后需要监听串口,N时间后未收到认为通信失败。使用java的FutureTask配合FileInputStream的available以及read去读响应。但是测试发现available返回num后...
  • 串口编程经典应用场景:打开串口,阻塞模式,非超时返回,有数据返回,无数据死等。 简易代码为例: void* read_thread(void* param) { char szbuf[128]; int size = 0; while (running) { size = read(fd, ...
  • 在实际对串口设备操作时,一般都需要超时read,关于read的第三个参数意义总是忘记。 1:open /dev/ttySP0 获取fd 2:write(fd,***,)向fd写数据 3:fd返回响应数据,并使用select+read进行超时读取未知、...
  • COMMTIMEOUTS 结构体被用在SetCommTimeouts和GetCommTimeouts 函数中,以便设置和查询通讯设备的超时参数。这个参数决定ReadFile, WriteFile, ReadFileEx, 和WriteFileEx 操作设备的行为。   typedef struct...
  • 读写超时是在 调用 ReadFile和 WriteFile函数读写串口的时候系统提供的超时机制typedef struct _COMMTIMEOUTS {DWORD ReadIntervalTimeout; /* Maximum time between read chars. */DWORD ...
  • 在用ReadFile和WriteFile读写...要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。 有两种超时:间隔超时和...
  • 在用ReadFile和WriteFile读写...要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。 有两种超时:间隔超时和...
  • 串口编程-读写超时 COMMTIMEOUTS设置

    千次阅读 2018-11-09 16:27:30
    读写超时是在 调用 ReadFile 和 WriteFile 函数读写串口的时候系统提供的超时机制 typedef struct _COMMTIMEOUTS {  DWORD ReadIntervalTimeout; /* Maximum time between read chars. */  DWORD ...
  • Windows系统利用此函数获取特定的通讯设备读写时的超时参数设定,GetCommTimeouts函数声明如下: BOOL GetCommTimeouts( HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts ); GetCommTimeouts函数的第一...
  • C# 函数超时处理

    2019-12-18 17:00:36
    串口测试的时候,发现断开硬件连接后发送数据一直无回应,故用此方法,等待指定的时间后做一些动作。 记录下,以后用的上。 public static bool isTimeOut(LS6827B_USB_CDC.TimeOutDelegate method,byte[] data)...
  • 串口通讯中(笔者系统为32位win7),为简单起见,经常采用同步方式读取串口... 设置串口读取和写入的超时时间,采用函数SetCommTimeouts。但笔者发现,有些串口设置读取超时时间后,在ReadFile时仍然会无限期等待,
  • // 读串口函数 BOOL SetTimeOuts(COMMTIMEOUTS stTimeOuts); // 设置超时时间 BOOL SetComm(int nBaudRate/*波特率*/,int nParity/*奇偶校验*/,int nByteSize, int nStopBits); // 设置串口 void CloseComm(); /...
  • /* 接收数据回调函数 */ static rt_err_t NetDev_input... /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */ rt_sem_release(&NetDev_COM_rx_sem); return RT_EOK; } //NetDev字节读取...
  • 串口编程之五:常用函数

    千次阅读 2013-07-29 17:09:15
    在进行串口通信时,经常需要用到下列一些API函数: CreateFile():用于打开一个文件访问串口; GetCommState():获取串口的当前配置,放入DCB中; SetCommState():根据DCB信息配置串口参数; ...
  • 源:串口通信中ReadFile和WriteFile的超时详解! 在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。要查询当前...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 207
精华内容 82
关键字:

串口超时函数