簡體   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