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



这是的代码片段

在这里,我正在启动一个Action Listener

    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");
        }

我没有正确接收数据,即

如果我发送一些数据作为"你好,你今天过得怎么样"它被接收为"你好h"哦"你今天做什么吗"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");
        }

如上所示,它运行良好。请帮助我如何消除延迟,因为它正在降低效率!

解决方案如下。

由于我的项目与嵌入式微控制器有关,给程序员一点信息。

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

即,它取决于您的函数在哪个ms任务中被调用,您是否正在使用RTOS。

因此,如果数据很大,例如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");
        }

最新更新