繁体   English   中英

Java中通过串行端口接收数据的效率更高

[英]Greater efficienty for data reception through serial port in Java

这是代码片段

我在这里启动一个动作监听器

    try {

        port_seleted.addEventListener(this);

    } catch (TooManyListenersException e) {
        System.out.println("too many Listeners!");
    }

    port_seleted.notifyOnDataAvailable(true);

当我收到数据时,下面的方法被调用

public void serialEvent(SerialPortEvent Ack_Rec) {

    boolean first_flash = false;

    if (Ack_Rec.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

        try {

            while (input_data.available() > 0) {
                input_data.read(rec_ack);
            }
        } catch (IOException e) {
            System.out.println("IO Exception in SerialEvent");
        }

我没有正确接收数据,即

如果我以“你好,你今天好吗”发送一些数据,则以“你好,你好”,“ ow”,“你”,“ doin”,“今天g”收到

即,串行事件方法被多次调用,即,在读取完整数据之前,它退出while循环。

如果我插入延迟

    try {

            while (input_data.available() > 0) {
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                input_data.read(rec_ack);
            }
        } catch (IOException e) {
            System.out.println("IO Exception in SerialEvent");
        }

如上所示,它工作正常。 请帮助我消除延迟,因为这会降低效率!

解决方案在这里。

由于我的项目与嵌入式微控制器有关,因此为程序员提供了一些信息。

任何串行通信协议都不能一次传输所有数据。 这取决于调用传输函数的周期。

也就是说,这取决于您正在使用RTOS的函数调用哪个ms任务。

因此,如果数据很大(例如1024字节),则可能无法一次即在一次函数调用时就传输所有数据,并且可能需要多个周期才能完成作业。

由于PC端比控制器端快得多,因此PC必须等待直到接收到所有数据后才能开始处理数据。

好的,现在来解决上述问题,

我知道我在每个事务中期望的字节数,可以说1000字节。


//代码段

public void serialEvent(SerialPortEvent Ack_Rec) {


        if (Ack_Rec.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

            try {

                while (in.available() > 0) {
                  int totalbytesreceivedinSession = in.read(sessionRead);

                    for (int bytesreceieved = 0; bytesreceieved < totalbytesreceivedinSession; bytesreceieved++) {

                        temporaryPacket[recDataCount++] = sessionRead[bytesreceieved];
                    } 
                    if(recDataCount == 1000){
                      //Process the data 
                      }
            }

希望这对您有所帮助,

干杯!

读取仅基于input_data.available()计数的可用字节数

int bytesAvailable = 0;
while ((bytesAvailable=input_data.available()) > 0) {


                input_data.read(rec_ack,0,bytesAvailable);
            }
        } catch (IOException e) {
            System.out.println("IO Exception in SerialEvent");
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM