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

              Đang tải...
              X