0

我正在开发一个 Java 软件,它必须能够读取设备通过串行 COM 端口发送的一些数据,通信速度对我来说非常重要,因此波特率设置为 921600。一开始一切正常很好(因此它读取了设备通过串行端口发送的正确数据),但过了一会儿,软件开始读取错误数据。看起来软件太慢了,当它们进入输入缓冲区时它实际上丢失了一些数据(可能是当输入缓冲区第一次完全填满时)。为了加快读取操作,我目前正在使用一种读取方法,在该方法中,软件每次读取时处理尽可能多的字节。我还尝试使输入缓冲区大小更大(通过使用 serialPort. setInputBufferSize(byte) 方法,但它没有解决我的问题)那么有没有人用 java 进行过快速串行通信?我错过了什么吗?为什么一段时间一切正常,然后停止正常工作?

这是我的读取部分(甚至驱动)的代码,请跳过数据转换部分,那只是因为每个数据实际上是由2个字节组成的,所以我也必须在将它们写入txt文件之前将它们组合起来。

/**
 *
 * @param evt
 */
@Override
public void serialEvent(SerialPortEvent evt) {

     switch(evt.getEventType()) {

        case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
            System.out.println("THE OUTPUT BUFFER IS EMPTY");
            break;

        case SerialPortEvent.DATA_AVAILABLE:
            try {     

                while(SerialPortEvent.DATA_AVAILABLE == 1) {


                   num_bytes = input.available();
                   array = new byte[num_bytes];

                   bytes_read = input.read(array, 0, num_bytes);

                   dato = new short[bytes_read];
                   datoc = new int[bytes_read/2];
                   datos = new String[bytes_read/2];


                   for(j=0;j<bytes_read;j++){                           
                       dato[j] = (short) (((byte) array[j]) & 0xff);
                   }

                   k = 0;
                   for(j=0;j<(bytes_read/2);j++){

                       datoc[j] = dato[k];
                       datoc[j] = (datoc[j]<<8) + dato[k+1];
                       datoc[j] = datoc[j] & 0xffffffff;  
                       k = k + 2;
                   }

                   for(j=0;j<(bytes_read/2);j++){

                       System.out.println(datoc[j]);
                       datos[j] = Integer.toString(datoc[j]);
                       output1.write(datos[j] + " ");
                   }

               }
            } catch(IOException ex) {
              logText = "Failed to read data. (" + ex.toString() + ")";
              System.out.println(logText);
            }
            break;

    }
4

2 回答 2

0

听起来您的程序未能足够快地为传入的数据提供服务;它会工作一段时间,因为输入进入缓冲区,并且当您清空缓冲区时,会有更多空间用于更多输入。但是如果数据进来的速度比你处理它的速度要快,那么最终你的缓冲区就会满了,数据仍然进来,无处可去。在串行通信中,此类数据被丢弃在(虚拟)地板上是/是典型的。

设置指示“缓冲区溢出”的状态也是典型的。我要检查的第一件事是在您用来读取串行数据的任何库中是否可以使用此状态,并查看它是否/何时设置。这将验证上述情况是否正在发生。

如果在您的环境中合理,要检查的另一件事是 XON/XOFF 功能。这是/是某些串行通信的一个特性,它允许接收器向发送器指示其缓冲区几乎已满并停止发送 (XOFF),直到被告知可以重新开始 (XON)。并非所有硬件和软件都支持此功能。

如果无论出于何种原因这都不起作用并且这确实是问题所在,那么您将不得不更好地处理数据或进一步缓冲数据。一个简单的蛮力方法是在字节进入时将它们写入存储,并在单独的线程中读取它们。例如,如果这是一个传统的计算机系统,您可以将它们写入磁盘,然后处理磁盘文件,在一个线程中打开它进行读取并在另一个线程中写入(多么有趣!)。

于 2012-10-04T17:39:19.117 回答
0

降低串行通信速度的原因是使用System.out.println(). 没有它,数据接收最终会很好

于 2013-07-14T18:55:52.997 回答