【问题标题】:Get the count of bytes waiting on a serial port before reading在读取之前获取串行端口上等待的字节数
【发布时间】:2011-08-25 00:43:18
【问题描述】:

我有一个定制的设备,我通过串口发送/接收数据。我想知道是否有任何函数可以用来获取等待从串口读取的字节数?

我只想要一个 windows api 解决方案,如果有的话。这似乎是一项微不足道的任务,我不想使用外部组件。

【问题讨论】:

    标签: delphi serial-port


    【解决方案1】:

    ClearCommError 应填写 COMSTAT(TComStat 记录),其中包含一个“cbInQue”成员,指定端口上接收的未读字节数。

    【讨论】:

    • 既然您是第一个提出适合该问题的答案的人,我认为您应得的 +1
    【解决方案2】:

    我使用TComPort。虽然您可以使用 WinAPi 调用,但它们很棘手,而 TComPort 会处理这些无聊的事情。它非常轻巧且免费,您可以使用帮助中的 TComport.InputCount 函数:

     Returns the number of bytes in input buffer.
    
    function InputCount: Integer;
    
    Description
    Call InputCount function to get the number of bytes in input buffer.
    

    【讨论】:

    • 在底层它使用 ClearCommError。 :-)
    【解决方案3】:

    Win API ClearCommError 应该返回接收缓冲区中等待的字符数,其中 cHandle 是当前使用/打开的串行通信端口。

    function TRS232Comm.InputCount: cardinal;
    var
      Errors: Cardinal;
      CommStat: TComStat;
    begin
      if not ClearCommError(cHandle, Errors, @CommStat) then
      begin
        PurgeComm(cHandle, PURGE_RXCLEAR);     //Just empty comm buffer on error and return 0
        result := 0;
      end else
        result := CommStat.cbInQue;
    end;
    

    【讨论】:

    • ClearCommError 失败并不意味着队列中没有任何内容,您应该通过调用GetLastError 告知问题所在,而不是返回'0'。
    • @Sertac Akyuz:是的,但这取决于您处理通信错误的位置和方式。
    • @GJ - 即便如此,这将是一个奇怪的设计。考虑到您的答案的唯一要点是提供代码示例(因为 api 已经在另一个答案中),这感觉不对。
    • @Sertac Akyuz:好的,我已经在通信错误上添加了 RX 清除缓冲区,稍后我在调用 GetLastError 时将在我的代码中使用它......
    • @GJ - 我不想在永恒之前选择 nick-pick 但是 ClearCommError 也会失败,如果你传递一个无效的句柄,然后在同一个句柄上调用 PurgeComm 将毫无用处..但无论如何感谢您的编辑。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多