我有一块硬件,它通过串口发出一个字节数据,表示频率为100Hz的电压信号。
我想编写一个读取数据的程序,以便我可以绘制它。我知道我需要打开串口并打开输入流。但是接下来的部分令我感到困惑,我在概念上无法理解这个过程:
我创建了一个while循环,一次从输入流中读取1个字节的数据。如何获得while循环时序,以便在到达readbyte行时始终可以读取一个字节?我猜我不能在while循环中放入一个sleep函数来尝试将它与硬件采样率相匹配。这只是继续在while循环中读取输入流的问题,如果它太快,那么它将不会做任何事情(因为没有新数据),如果它太慢,那么它将在输入流缓冲区中累积? / p>
就像我说的那样,我只是试图从概念上理解这一点,所以任何指导都会非常感激!我猜这个想法与我正在使用的编程语言无关,但如果没有,则假设它是用于Java。
答案 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。
希望有所帮助