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

              • mèomướp
                Trả lời cho Sửa bộ nguồn DC 60V 45A
                bởi mèomướp
                Dạ hông dám làm thì chắc chắn sẽ mãi ko thể làm được đâu ạ. Nguồn xung dân dụng vài kw giờ rất nhìu ạ, sạc ô tô điện, máy hàn, lò vi sóng, âm ly... tùy chất lượng mà độ phức tạp sẽ khác nhau ạ. Và cái giá phải trả về kinh tế...
                hôm nay, 13:11
              • tuyennhan
                Trả lời cho Sửa bộ nguồn DC 60V 45A
                bởi tuyennhan
                Sửa dạng này thì chuyên còn không dám chắc khộng cháy nổ với linh kiện bán ngoài chợ nói gì khộng chuyên .
                hôm nay, 09:25
              • tuyennhan
                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                bởi tuyennhan
                Đúng rồi chọn mua theo tai . ca thì phải toàn dải nhạc thì chỉ cao và thấp thé nên loa ca thì nghe nhạc không hay và ngược lại .
                Muốn ca và nhạc đều hay thì phải dúng 2 giàn , còn nếu chỉ có 1 thì phải chỉnh sửa lại sao cho ca và nhạc đều được không quá dở ....
                hôm nay, 09:10
              • Ng.Phuong.5
                Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                bởi Ng.Phuong.5
                Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                Mấy con...
                Hôm qua, 19:44
              • viettinh
                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                bởi viettinh
                Bác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
                Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...
                Hôm qua, 18:12
              • nguyendinhvan
                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                bởi nguyendinhvan
                Theo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
                Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
                Cách đơn giản...
                Hôm qua, 00:04
              • mèomướp
                Trả lời cho Sửa bộ nguồn DC 60V 45A
                bởi mèomướp
                Dạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
                08-01-2025, 19:02
              • tuyennhan
                Trả lời cho Sửa bộ nguồn DC 60V 45A
                bởi tuyennhan
                Chủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
                08-01-2025, 15:43
              • tuyennhan
                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                bởi tuyennhan
                Loa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
                08-01-2025, 15:28
              • mèomướp
                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                bởi mèomướp
                Dạ loa tép bé xíu như ngón chân cái thôi ạ. Thiếu gì chỗ để đâu. Quan trọng là gắn thêm nó loa nghe ok hay ko thôi ạ...
                08-01-2025, 11:44
              Đang tải...
              X