Thông báo

Collapse
No announcement yet.

[Problem] Giao tiếp RS232 với PC bằng Java

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • [Problem] Giao tiếp RS232 với PC bằng Java

    F có làm 1 PM nhỏ để nhận dữ liệu 8 bits từ cổng COM trong Java nhưng gặp một vấn đề. Khi để DATABITS_8 thì truyền số 94 (BIN: 1011110) thì nhận được khi thì 94, khi thì 222 (11011110). Tức là bit đầu khi thì nó cho là 0 khi thì 1. Chỉnh xuống DATABITS_7 thì nhận được đúng 94. Tuy nhiên yêu cầu là truyền được từ 0 -> 255 nên F đang bí.

    Truyền thì không thể sai vì có thử bằng hyperterminal nó vẫn ra đúng số 94.

    Xin các bác giúp dùm hướng xử lý.

    PS: F dùng gói Javax.comm

  • #2
    Nếu muốn truyền 8bit data trên 7bit thì phải truyền 2 lần 7bit .
    Muốn truyền chính xác dữ liệu phải truyền data theo gói, trong gói phải có byte đồng bộ, crc.
    Từ chối trách nhiệm:
    Mọi thông tin từ ITX cung cấp với hi vọng nó có ích và không đi kèm với bất kì sự bảo đảm nào.
    Blog: http://mritx.blogspot.com

    Comment


    • #3
      F không hiểu ý mod lắm. Đây là code của class nhận dữ liệu.
      Mong mọi người giúp đỡ, làm sao nó nhận được 8 bits đủ 8 bits để không có tình trạng như muốn nhận được 94 nhưng lại nhận được 222.

      import java.io.*;
      import java.util.*;
      import javax.comm.*;
      import javax.swing.*;

      public class RS232Interface implements Runnable, SerialPortEventListener {
      static CommPortIdentifier portId;
      static Enumeration portList;
      InputStream inputStream;
      SerialPort serialPort;
      Thread readThread;
      double data = 0;
      String defaultPort = "";

      public RS232Interface() {
      }

      public void Initiate() {
      boolean portFound = false;

      portList = CommPortIdentifier.getPortIdentifiers();

      while (portList.hasMoreElements()) {
      portId = (CommPortIdentifier) portList.nextElement();
      if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
      if (portId.getName().equals(defaultPort)) {
      portFound = true;

      try {
      serialPort = (SerialPort) portId.open("RS232Interface", 2000);
      } catch (PortInUseException e) {}

      try {
      inputStream = serialPort.getInputStream();
      } catch (IOException e) {}

      try {
      serialPort.addEventListener(this);
      } catch (TooManyListenersException e) {}

      serialPort.notifyOnDataAvailable(true);

      try {
      serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
      SerialPort.STOPBITS_1,
      SerialPort.PARITY_NONE);
      } catch (UnsupportedCommOperationException e) {}

      readThread = new Thread(this);

      readThread.start();

      }
      }
      }
      if (!portFound) {
      JOptionPane.showMessageDialog(null, "Port " + defaultPort + " is not found.");
      }
      }

      public double getData() {
      return data;
      }

      public void setDefaultPort(String COM_Port) {
      defaultPort = COM_Port;
      }

      public void set0() {
      data = 0;
      }

      public void run() {
      try {
      Thread.sleep(20000);
      } catch (InterruptedException e) {}
      }


      public void serialEvent(SerialPortEvent event) {
      switch (event.getEventType()) {

      case SerialPortEvent.BI:

      case SerialPortEvent.OE:

      case SerialPortEvent.FE:

      case SerialPortEvent.PE:

      case SerialPortEvent.CD:

      case SerialPortEvent.CTS:

      case SerialPortEvent.DSR:

      case SerialPortEvent.RI:

      case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
      break;

      case SerialPortEvent.DATA_AVAILABLE:

      try {
      while (inputStream.available() > 0) {
      data = inputStream.read();
      }

      } catch (IOException e) {}

      break;
      }
      }

      }

      Comment


      • #4
        1. Muốn truyền 8bit data trên khung 7bit.
        [0000111]+[1xxxxxx] = [00001111]
        ---7bit----- ---7bit-- ----8bit------

        2. Muốn truyền chính xác:
        [--Byte đồng bộ---]+[--byte data --]+[--Byte CRC --]

        Truyền nhiều byte cùng lúc
        [--Byte đồng bộ---]+[--byte data 1 --]+[--byte data 2 --]+[--byte data n --]+[--Byte CRC --]

        đây là cách làm đơn giản.
        Từ chối trách nhiệm:
        Mọi thông tin từ ITX cung cấp với hi vọng nó có ích và không đi kèm với bất kì sự bảo đảm nào.
        Blog: http://mritx.blogspot.com

        Comment


        • #5
          Cảm ơn mod nhiều.
          Nhưng vì sao chỉ có chương trình Java nhận dữ liệu sai còn nếu thử dùng HyperTerminal trong Win thì vẫn ra số đúng?
          Mong mod giải thích giúp. F mới tìm hiểu nên thấy hơi lạ.

          Comment


          • #6
            Do rất nhiều lý do, nhưng thông thường do hàm giao tiếp hardware chạy không đúng hặc quá cũ với os hoặc JVM (Java Virtual Machine). Nhưng khả năng lớn nhất vẫn là tại người lập trình.
            Từ chối trách nhiệm:
            Mọi thông tin từ ITX cung cấp với hi vọng nó có ích và không đi kèm với bất kì sự bảo đảm nào.
            Blog: http://mritx.blogspot.com

            Comment


            • #7
              Bạn thử dùng thư viện RXTX xem sao. Download thư viện này ở đây:

              http://www.rxtx.org/

              Bạn có thể tham khảo nhanh cách sử dụng thư viện ở trang này:

              http://www.captain.at/howto-java-ser...-comm-rxtx.php

              Chúc thành công!

              Comment

              Về tác giả

              Collapse

              fasterfox Tìm hiểu thêm về fasterfox

              Bài viết mới nhất

              Collapse

              • bqviet
                Trả lời cho Đấu tắt điện cho máy tính bảng
                bởi bqviet
                Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
                06-12-2025, 17:17
              • nguyendinhvan
                Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
                bởi nguyendinhvan
                Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
                05-12-2025, 19:59
              • afrendly
                Trả lời cho Đấu tắt điện cho máy tính bảng
                bởi afrendly
                Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
                04-12-2025, 01:27
              • nick22
                Trả lời cho Máy điện châm ?
                bởi nick22
                Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
                01-12-2025, 13:23
              Đang tải...
              X