rs232通信,一般时序

时间:2010-04-29 00:57:24

标签: plot charts serial-port

我有一块硬件,它通过串口发出一个字节数据,表示频率为100Hz的电压信号。

我想编写一个读取数据的程序,以便我可以绘制它。我知道我需要打开串口并打开输入流。但是接下来的部分令我感到困惑,我在概念上无法理解这个过程:

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

就像我说的那样,我只是试图从概念上理解这一点,所以任何指导都会非常感激!我猜这个想法与我正在使用的编程语言无关,但如果没有,则假设它是用于Java。

4 个答案:

答案 0 :(得分:1)

如果您使用Java communications API,则根本不会进行投票。 相反,您将实现一个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");
       }

...

答案 1 :(得分:0)

你等到端口有一个字节(如果它的窗口,那么有一个api知道rs232是否有字节等待,或做阻塞读取)...理想情况下你把你的阅读代码放在一个单独的线程中。 ..等待字节并将它们泵入一些有意义的数据结构。

答案 2 :(得分:0)

100Hz非常慢 - 例如9 mSecs就没有问题'睡觉'......

但正如Hamish所说,可能有一个事件通知缓冲区中有数据 - 使用它并记住,如果你的读数是ASCII或多个字节,你需要缓冲你得到的字节,直到你在实际处理之前有一个完整的读数(或ASCII线)。

希望这会有所帮助......

答案 3 :(得分:0)

教程:http://devdot.wikispaces.com/Iphone+Serial+Port+Tutorial

回到概念。

字节通过串口作为流来。因此,如果您的程序太慢而无法获取字节,则会丢失一些字节。有一些方法可以最大限度地减少问题:

    串行芯片中的
  • 缓冲区(可能最多16个字节或更多)。当有任何数据进入时,系统会中断您的程序并告诉您缓冲区中有一些新字节。所以程序可以批量获取它们。另外,中断驱动的程序不会通过循环字节来使cpu繁忙。

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

希望有所帮助