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

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • fasterfox
    Thành viên mới
    • Nov 2009
    • 3

    #1

    [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
  • itx
    Moderator
    • Feb 2008
    • 1365

    #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

    • fasterfox
      Thành viên mới
      • Nov 2009
      • 3

      #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

      • itx
        Moderator
        • Feb 2008
        • 1365

        #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

        • fasterfox
          Thành viên mới
          • Nov 2009
          • 3

          #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

          • itx
            Moderator
            • Feb 2008
            • 1365

            #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

            • lethang85
              Banned
              • Mar 2008
              • 43

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

              Identify unknown USB hardware from lsusb, dmesg or Device Manager by vendor ID and product ID.


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

              captain.at ist Ihre erste und beste Informationsquelle über captain. Hier finden Sie auch weitere interessante Links. Wir hoffen, dass Sie bei Ihrer Suche erfolgreich sind!


              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...