Plot rs232通信,一般定时

Plot rs232通信,一般定时,plot,charts,serial-port,Plot,Charts,Serial Port,我有一个硬件,它通过串行端口以100Hz的频率发送一个表示电压信号的字节数据 我想写一个程序来读取数据,这样我就可以绘制它了。我知道我需要打开串行端口并打开输入流。但下一部分让我感到困惑,我在概念上难以理解这个过程: 我创建了一个while循环,每次从inputstream读取1个字节的数据。如何获得while循环计时,以便在到达readbyte行时始终有一个字节可供读取?我猜我不能只是在while循环中加入一个sleep函数来尝试匹配硬件采样率。这仅仅是在while循环中继续读取inputst

我有一个硬件,它通过串行端口以100Hz的频率发送一个表示电压信号的字节数据

我想写一个程序来读取数据,这样我就可以绘制它了。我知道我需要打开串行端口并打开输入流。但下一部分让我感到困惑,我在概念上难以理解这个过程:

我创建了一个while循环,每次从inputstream读取1个字节的数据。如何获得while循环计时,以便在到达readbyte行时始终有一个字节可供读取?我猜我不能只是在while循环中加入一个sleep函数来尝试匹配硬件采样率。这仅仅是在while循环中继续读取inputstream的问题,如果它太快,那么它不会做任何事情(因为没有新数据),如果它太慢,那么它将在inputstream缓冲区中累积


就像我说的,我只是想从概念上理解这一点,所以任何指导都将不胜感激!我猜这个想法与我使用的编程语言无关,但如果不是,则假设它用于Java。

您等待端口有一个字节(如果是窗口,则有一个api来知道rs232是否有一个字节等待,或者执行阻塞读取)。。。理想情况下,您可以将读取的代码放在一个单独的线程中……等待字节并将它们注入一些有意义的数据结构。

您可以等待端口有一个字节(如果是它的窗口,那么就有一个api来知道rs232是否有一个字节等待,或者执行阻塞读取)。。。理想情况下,您可以将读取的代码放在一个单独的线程中…等待字节并将它们注入一些有意义的数据结构。

100Hz非常慢-在9毫秒内不会出现“睡眠”问题

但正如Hamish所说,很可能有一个事件通知缓冲区中有数据——请使用该事件,并记住,如果您的读数是ASCII或超过多个字节,则在实际处理之前,您需要缓冲您得到的字节,直到您有一个完整的读数(或一行ASCII??)


希望这能有所帮助……

100Hz的速度相当慢-比如说9毫秒内“睡眠”不会有问题

但正如Hamish所说,很可能有一个事件通知缓冲区中有数据——请使用该事件,并记住,如果您的读数是ASCII或超过多个字节,则在实际处理之前,您需要缓冲您得到的字节,直到您有一个完整的读数(或一行ASCII??)

希望这对您有所帮助……

如果您正在使用,那么您将根本不会进行轮询。 相反,您将实现一个SerialPortEventListener,并在端口有可用数据时接收回调

public class SerialConnection implements SerialPortEventListener
{
      private SerialPort         sPort;

...
    // Add this object as an event listener for the serial port.
       try
      {
          sPort.addEventListener(this);
       }
      catch (TooManyListenersException e)
      {
          sPort.close();
          throw new SerialConnectionException("too many listeners added");
       }

...
如果您正在使用,则根本不会进行轮询。 相反,您将实现一个SerialPortEventListener,并在端口有可用数据时接收回调

public class SerialConnection implements SerialPortEventListener
{
      private SerialPort         sPort;

...
    // Add this object as an event listener for the serial port.
       try
      {
          sPort.addEventListener(this);
       }
      catch (TooManyListenersException e)
      {
          sPort.close();
          throw new SerialConnectionException("too many listeners added");
       }

...
教程:

回到概念上来

字节通过串行端口以流的形式出现。因此,如果您的程序太慢,无法提取字节,则会丢失一些字节。有一些方法可以将问题最小化:

  • 串行芯片中的缓冲区(可能最多16字节或更多)。当有任何数据输入时,系统会中断您的程序,并告诉您缓冲区中有一些新字节。这样程序就可以批量得到它们。此外,中断驱动程序不会因循环字节而使cpu繁忙

  • 协议级别。串行端口只是通道。您的程序和串行端口另一端的程序可能具有更高级别的协议,以简化通信并最大限度地减少数据丢失。典型的机制是xon-xoff

希望对您有所帮助

教程:

回到概念上来

字节通过串行端口以流的形式出现。因此,如果您的程序太慢,无法提取字节,则会丢失一些字节。有一些方法可以将问题最小化:

  • 串行芯片中的缓冲区(可能最多16字节或更多)。当有任何数据输入时,系统会中断您的程序,并告诉您缓冲区中有一些新字节。这样程序就可以批量得到它们。此外,中断驱动程序不会因循环字节而使cpu繁忙

  • 协议级别。串行端口只是通道。您的程序和串行端口另一端的程序可能具有更高级别的协议,以简化通信并最大限度地减少数据丢失。典型的机制是xon-xoff


希望有帮助

听说过缓冲吗?理想情况下,您只希望在数据到达时收到通知。您使用的是什么语言?随着我继续研究,我想我理解了缓冲是如何工作的。我看到的所有示例都显示类似while的内容(inputStream.readByte()!=-1)。我假设,因为我希望不断地读取数据,所以我不会将其用作while语句(而是将某种布尔值连接到while语句中的按钮)。这听起来对吗?(仅供参考:我最终将使用Objective C与iPhone配件进行通信,但可能只是编写一个快速java程序进行调试,并确保我已经记下了这个概念)。谢谢听说过缓冲吗?理想情况下,您只希望在数据到达时收到通知。您使用的是什么语言?随着我继续研究,我想我理解了缓冲是如何工作的。我看到的所有示例都显示类似while的内容(inputStream.readByte()!=-1)。我假设,因为我希望不断地读取数据,所以我不会将其用作while语句(而是将某种布尔值连接到while语句中的按钮)。这听起来对吗?(仅供参考:我最终将使用Objective C与iPhone配件进行通信,但可能只是编写一个快速java程序进行调试,并确保我已经记下了这个概念)。谢谢意甲