Thông báo

Collapse
No announcement yet.

Sử dụng cổng RS232 trên nền Linux

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Sử dụng cổng RS232 trên nền Linux

    Đây là lần đầu tiên bqviet mở một luồng trên diễn đàn. Mục đích là nhằm "cạnh tranh" với luồng của F bên picvietnam. @F: làm ơn tập trung vào một nơi thôi, có thể để bài viết ở một nơi tập trung (dientuvietnam chẳng hạn) rồi đặt các bài trỏ từ diễn dàn khác tới (picvietnam, dspvietnam, avrvietnam, blahblahblahvietnam ...) thì sẽ thống nhất hơn. Đấy là nói chơi, mục đích chính nhằm chia xẻ kinh nghiệm sử dụng cổng RS232 trên nền Linux để kết nối với bên ngoài (thiết bị, hệ thống khác) một cách thực dụng, không phải lý thuyết kiểu như thanh ghi nọ, chế độ bắt tay kia...

    Tại sao người làm điện tử, hệ nhúng và tự động hóa cần cổng RS232 ?
    • Vì đây là cách thức đơn giản nhất để kết nối thiết bị, hệ thống bên ngoài với máy tính theo kiểu tuần tự (serial). Có nhiều cách khác như cổng song song, Ethernet, USB, IEEE1394 nhưng đều phức tạp hơn nhiều. Đừng ai đề cập tới ISA hay PCI đấy nhé !
    • Vì nó tin cậy ở tốc độ thấp, với chút ít kiến thức, có thể chế mạch cách ly quang đơn giản và khỏi lo hỏng máy tính khi có sự cố.
    • Vì nó đủ nhanh, tốc độ tối đa phụ thuộc vào mainboard máy tính nhưng ít nhất cũng đạt tới 115200 baud, đáp ứng > 90% nhu cầu thử nghiệm thực tế.
    • Với phần mềm thích hợp, sử dụng cổng RS232 ít phụ thuộc vào hệ điều hành.
    • Vì dễ điều khiển - có lẽ đây là điều đáng quan tâm nhất đối với người làm phàn cứng và lập trình.
    • ...


    Loạt bài viết sau sẽ đề cập tới các khía cạnh sau
    • Phần mềm điều khiển cổng
    • Cách lập trình với cổng
    • Những ứng dụng khác
    Phần mềm tự do hoặc không dùng máy tính nữa !.

  • #2
    Phần mềm điều khiển cổng chạy trên Linux

    Một trong những điều khó chịu nhất của người làm điện tử khi chuyển sang Linux là hệ này thiếu một phần mềm kiểu Hyper terminal. Tìm trên mạng thì sẽ gặp một loạt gợi ý sử dụng những chương trình thuộc họ Terminal như minicom, gterm... mà khi sử dụng không khác nào húc đầu vào đá. Vấn đề ở đây là cần một chương trình thật đơn giản để gửi/nhận ký tự ASCII, tải lên / tải xuống tập tin hex... chứ không phải kết nối X,Y,Z modem hay tới ComputeServer. Nếu có thể, bật/tắt các chân RTS và DTR càng tốt. (Nếu bạn không biết RTS và DTR có ý nghĩa gì ở cổng tuần tự thì chắc cũng không cần đọc tiếp nữa đâu.)

    Mãi gần đây tôi mới tìm được 2 chương trình tương đối ưng ý
    1. RealTerm là chương trình miễn phí, mã mở viết bằng Delphi. Chương trình chạy trên Windows, nhưng có thể chạy mô phỏng bằng Wine dễ dàng. Nếu chưa ưng có thể lấy mã nguồn của chương trình này về hack. Chức năng tương tự Hyper terminal, ngoài ra có khả năng đọc/ghi trạng thái của các sợi điều khiển cổng RS232. Giao tiếp được I2C cũng là một tính năng rất hay của chương trình này.
    2. Cutecom với giấy phép GPL, viết trên nền thư viện Qt và chỉ chạy trên Linux. Đúng như tên gọi, nó có giao diện rất đẹp, gọn gàng nhưng chức năng hơi đơn giản. Nếu nhu cầu chỉ ở mức cơ bản thì cutecom phù hợp nhất.
    3. Bản thân tôi cũng viết một chương trình đơn giản trên nền thư viện wxWidgets để dùng cho công việc. Chức năng tương tự cutecom nhưng bổ sung thêm phần xử lý giao thức Sixnet và Modbus. Mục đích chính là để thử nghiệm thiết bị vào/ra phân tán của hãng Sixnet trước khi ứng dụng vào hệ SCADA cỡ nhỏ trên tàu thủy.


    Trong Kubuntu, phần mềm cutecom có thể cài đặt dễ dàng thông qua Adept manager.
    Attached Files
    Last edited by bqviet; 21-02-2008, 18:05. Lý do: Sửa chính tả
    Phần mềm tự do hoặc không dùng máy tính nữa !.

    Comment


    • #3
      Lập trình điều khiển cổng RS232

      Khi nghe nói tới lập trình điều khiển cổng RS232, đa phần người ta nghĩ ngay tới đọc/viết thanh ghi, rồi chế độ bắt tay, device driver, interrupt, Windows SDK hay ba cái thứ lăng nhăng khác. Đó là những gì được dạy trong nhà trường. Thực tế cổng tuần tự RS232 tối giản chỉ gồm 3 sợi dây: thu, phát, đất. Người ta cần gửi một/chuỗi byte đi và nhận một chuỗi byte về với độ dài nói chung đã biết trước. Và người ta cần một thư viện lớp (C++, Python hoặc Delphi) để làm nhiệm vụ này. Đơn giản vậy thôi.

      Trên nền Windows, vấn đề thường được giải quyết bằng ActiveX kiểu như mscom hay một lớp trong MFC. Trên nền Linux, vấn đề có vẻ phức tạp hơn vì liên quan tới chế độ bảo mật, tuy nhiên cũng có một số giải pháp
      • QextSerialPort là thư viện bổ sung cho Qt để lập trình cổng RS232. Thư viện này tuân theo mô hình thiết bị của Qt và có nhiều tính năng khá cao cấp. Nhược điểm là chỉ chạy với thư viện Qt (đôi khi lại là ưu điểm nếu phần mềm được viết vốn cũng dùng Qt). Thử một lần là mê.
      • Nếu không dùng Qt, thư viện wxCTB là một thay thế tốt. Nó dựa trên nền thư viện wxWidgets nhưng cũng có thể sử dụng độc lập không cần wxWidgets. Có nhiều tính năng hay, nhưng chưa bằng QextSerialPort; bù lại nó hỗ trợ nhiều cổng loại khác, kể cả GPIB.
      • Nếu không dùng C++, có thể lập trình trực tiếp thông qua lời gọi hệ thống nhân Linux, thậm chí đọc/viết thanh ghi. Tài liệu "Serial HOWTO" đủ đáp ứng nhu cầu này. Mã nguồn phần điều khiển cổng của phần mềm PonyProg là một nguồn tham khảo đáng tin cậy. (Bản thân PonyProg cũng là phần mềm nạp chíp rất tốt trên nền Linux.)
      Phần mềm tự do hoặc không dùng máy tính nữa !.

      Comment


      • #4
        Nếu bác bqviet thấy bài này làm lệch luồng bác xoá đi giúp em nhé.

        Mục tiêu của em làm hai việc. Một là cổ vũ cộng đồng dùng Ubuntu, thì việc này em làm trên dientuvietnam. Nhưng một mặt khác thì em cũng là admin của picvietnam, cho nên mục tiêu thứ hai của em là trang bị các công cụ và phát triển cộng động pic.

        Tới giai đoạn này, thì xem như công việc của em trên cộng đồng dientuvietnam (hay nói chung là cái lớn đã xong), giờ chỉ còn là thảo luận và phân tích thêm. Còn các bài viết trên picvietnam thì mang tính chất tutorial để tập trung cho riêng về PIC. Những gì không dính dáng đến PIC mà dính dáng đến điện tử hay Ubuntu thì em sẽ post ở đây.

        Đúng là cái phần RS232 này cũng nên xây dựng ở đây, xong rồi em sẽ chuyển về picvietnam sau (dạng copy lại). Chắc cái USB cũng sẽ vậy, nhưng mà cái phần kết nối và ứng dụng trên PIC sẽ lại bỏ qua picvietnam.

        Cám ơn bác nhiều về bài viết này, em sẽ theo bác vụ này để học hỏi.

        Chúc vui
        Falleaf
        Công ty TNHH Thương mại và Giao nhận R&P
        58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
        mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

        Comment


        • #5
          Bác ơi, bác bỏ em bơ vơ một mình chiến đấu sao?

          Em vừa lập dự án Open PM2I - Picvietnam Multi-Platform Multi-port Interface

          Phần đầu của dự án là phần thiết kế giao diện đồ họa bằng QT. Báo cáo này do Lê Quang Hòa thực hiện. Tất nhiên báo cáo này ko nhằm mục đích rằng sẽ phổ biến toàn bộ và open source cho cộng đồng sử dụng, bởi đây là dự án của công ty, tuy nhiên, các phần báo cáo này có tính chất hướng dẫn tốt, do vậy F đem phần báo cáo thứ nhất gửi lên cho mọi người cùng tham khảo.

          Báo cáo này F xin phép post ở hai nơi, không nhằm mục đích quảng cáo (vớ vẩn khi quảng cáo cái này), vì mục tiêu của dự án là giao tiếp máy tính, nhưng mà phần đầu của nó lại là thiết kế giao diện đồ họa. Do vậy F gửi thêm một bản ở phần thiết kế giao diện đồ họa với QT.

          Chúc vui.
          Attached Files
          Falleaf
          Công ty TNHH Thương mại và Giao nhận R&P
          58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
          mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

          Comment


          • #6
            Mã nguồn chương trình thao tác cổng

            Đây là chương trình mà tôi viết để thao tác với cổng RS232 dùng cho công việc. Cái này đơn giản và không liên quan gì tới bí mật công ty nên đưa lên để mọi người tham khảo. Dự định sẽ hỗ trợ Ethernet và USB nhưng chưa làm được ngay. Nó có thể sử dụng thay thế Hyper terminal thông thường, hoặc hỗ trợ các giao thức cấp cao phía trên như Modbus ASCII, Modbus RTU và Sixnet. Có 2 makefile để build trên nền Linux hoặc Windows (dùng MingGW). Giấy phép là GPL2, không chịu trách nhiệm gì cả.
            Attached Files
            Phần mềm tự do hoặc không dùng máy tính nữa !.

            Comment


            • #7
              Hi hi co bac nao thic lam giao tiep RS232 bang java khong cai nay chay khap noi he dieu hanh nao cung chay chi can cai may ao JVM cai goi thu vien giao tiep cong Javax.comm.* (cai goi nay da duoc SUN viet chi can lay ve va tich hop voi may ao la duoc) chay duoc ca tren linux lan tren windows) cai goi nay lam duoc nhieu viec lam do LPT RS232 deu dung cai goi nay de dieu khien. ngoai ra sun con cung cap nhieu goi khac nua nhu goi USB dung de dieu khien cong USB nhug cai nay em chua dung bao gio nen khong noi luc khac na yduoc hi hi tim hieu xong se ghi ra sau ve cai goi java.usb.* em khong biet post file dinh kem the nao den dua het code cua cai chuong trinh do cho cac bac coi nhe OPEN SOUCE CODE

              dung JDK ma dich nhe nhung truoc khi dich thi phai di tich hop goi thu vien java.comm.* cai da
              day la ma nguon cua cai file RS_232Frame.java



              Code:
              package MainControl;
              import java.awt.*;
              import java.awt.event.*;
              import javax.swing.*;
              import javax.comm.*;
              import javax.*;
              import java.util.*;
              import java.io.*;
              public class RS_232Frame extends Frame  implements Runnable,
               ActionListener,ItemListener,WindowListener,SerialPortEventListener,CommPortOwnershipListener{ 	 
                   static CommPortIdentifier portId;  
                   static Enumeration portList;
                    InputStream inputStream;
                   SerialPort serialPort;     
                   Choice  baudChoice,byteChoice,parityChoice,stopChoice,minu;
                    Button open,close,control;
                   TextArea tx=new TextArea("                  Chương trình đi?u khiển cổng Serial  ");
                   Choice port = new Choice();
                   Panel p;     
                   int Count,baud,bit,parityBit,stopbit;                    
                    int parity []={SerialPort.PARITY_NONE,SerialPort.PARITY_EVEN,SerialPort.PARITY_MARK,SerialPort.PARITY_ODD,SerialPort.PARITY_SPACE};
                    Label lblP,lbls;
                    String  str[] = {"no","event","mark","odd","space" } ;    
                    int stop[]={serialPort.STOPBITS_1,serialPort.STOPBITS_1_5,serialPort.STOPBITS_2 }                   ;
                     static Panel pc=new Panel(); 
                     Checkbox cDTR,cRTS, on;   
                     JButton b; 
                       ImageIcon sang = new ImageIcon("../src/sang.gif");        
                       ImageIcon toi = new ImageIcon("../src/toi.gif");              
              public RS_232Frame() {          
               	
              //     	super("Chương Trình thử nghiệm giao diện RS-232 (Nguyễn Tất Hùng)");         
                   	setLayout(new GridLayout(1,1));     
                   	p= new Panel();
                   	p.setSize(this.getWidth(),this.getHeight());
                   	open = new Button("Open Port");
                   	close = new Button("Close Port");
                   	control = new Button("Set port's parameter");     	
                     GridBagLayout gridBag = new GridBagLayout();
                  	GridBagConstraints cons = new GridBagConstraints();    	
                       p.setLayout(gridBag);   
                       cons.fill=cons.BOTH;
                       cons.anchor=cons.NORTHEAST;                   
                        cons.gridx=0;
                       cons.gridy=0;
                       cons.gridwidth=5;         
                       cons.gridheight=1;            
                       tx.setBackground(Color.black);
                       tx.setForeground(Color.GREEN);           
                       gridBag.setConstraints(tx,cons);
                        p.add(tx);
                       cons.gridwidth=1;    
                        cons.gridheight=1;
                       cons.gridx=0;
                       cons.gridy=1;                          
                       Label lb = new Label("Port Name:");
                       gridBag.setConstraints(lb,cons);
                       p.add(lb);
                       Panel m= new Panel();
                       b = new JButton();
                       m.add(b);       
                       b.setIcon(sang);
                       cons.gridx=4;
                       cons.gridy=1;         
                       gridBag.setConstraints(m,cons);
                      p.add(m); 
                       
                       cons.gridx=0;
                       cons.gridy=2;         
                       
                       Label lb1 = new Label("Baud Rate:");
                       gridBag.setConstraints(lb1,cons);
                       p.add(lb1);
                                
                       cons.gridx=1;
                       cons.gridy=1;
                       port.add("COM1");
                       port.add("COM2");          
                       gridBag.setConstraints(port,cons);         
                        p.add(port);      
                           	 
                      cons.gridx=1;
                      cons.gridy=2;
                      baudChoice = new Choice();
              	    baudChoice.addItem("300");
              	    baudChoice.addItem("2400");
              	    baudChoice.addItem("9600");
              	    baudChoice.addItem("14400");
              	    baudChoice.addItem("28800");
              	    baudChoice.addItem("38400");
              	    baudChoice.addItem("57600");
              	    baudChoice.addItem("152000");	     
                       baudChoice.addItemListener(this);     
                       gridBag.setConstraints(baudChoice,cons);         
                        p.add(baudChoice);    
                        
                      cons.gridx=2;
                      cons.gridy=1;
                      cons.gridwidth=1;
                      Label lblBit = new Label("Bit");
                      gridBag.setConstraints(lblBit,cons); 
                      p.add(lblBit);  
                            
                      cons.gridx=3;
                      cons.gridy=1;
                      cons.gridwidth=1;
                      byteChoice = new Choice();
                      for(int i= 5;i <= 8;i++)
              	    byteChoice.addItem(i+"");	    
              	    gridBag.setConstraints(byteChoice,cons); 	    
              	    byteChoice.addItemListener(this);       
                      p.add(byteChoice);
                      
                      cons.gridx=0;
                      cons.gridy=4;
                      lblP = new Label("Patiry:");                                
                      gridBag.setConstraints(lblP,cons); 	    
                      p.add(lblP);   
                      
                      cons.gridx=2;
                      cons.gridy=4;
                      lbls = new Label("Stop bit:");                                
                      gridBag.setConstraints(lbls,cons); 	    
                      p.add(lbls);   
                      
                      cons.gridx=1;
                      cons.gridy=4;
                      parityChoice = new Choice() ;
                       for(int i= 0; i<=4;i++)      
                           
                       parityChoice.addItem(str[i]);                             
                       parityChoice.addItemListener(this);  
                      gridBag.setConstraints(parityChoice,cons); 	    
                      p.add(parityChoice);                  
                      
                      Label   minute =new Label("Thời gian nháy(Phút):")  ;  
                       
                       
                      cons.gridx=3;
                      cons.gridy=4;                 
                       gridBag.setConstraints(minute,cons); 	    
                       p.add(minute);                         
                       
                      cons.gridx=5;
                      cons.gridy=4;
                      minu = new Choice() ;
                       for(int i= 0; i<=10;i++)                   
                       minu.addItem((i+1)+"");                             
                       minu.addItemListener(this);  
                       gridBag.setConstraints(minu,cons); 	    
                       p.add(minu);                         
                       
                      cons.gridx=3;
                      cons.gridy=4;     
                      cons.gridwidth=1;   
                      stopChoice = new Choice() ;                 
                       stopChoice.addItem("1");                   
                       stopChoice.addItem("1,5");                  
                       stopChoice.addItem("2");                                
                      stopChoice.addItemListener(this);
                      gridBag.setConstraints( stopChoice,cons); 	    
                      p.add( stopChoice);                                           
                      
                      cons.gridx=0;
                      cons.gridy=3;
                       gridBag.setConstraints(open,cons); 
                       open.addActionListener(this);
                       p.add(open);
                       cons.gridx=1;
                       cons.gridwidth=2;
                       close.addActionListener(this);         
                   	 close.setEnabled(false); 
                       gridBag.setConstraints(close,cons);                                
                       p.add(close);
                       cons.gridwidth=2;
                       cons.gridx=3;
                       gridBag.setConstraints(control,cons);   
                       control.addActionListener(this);                            
                        p.add(control);              	
                   	  add(p);     	       	 
                       cons.gridx=2;
                       cons.gridy=2;
                       cons.gridwidth=3;
                       gridBag.setConstraints(pc,cons);
                        p.add(pc);          
                        pc.add(new Label("Nhay Nhanh"));
                        cDTR = new Checkbox();    		
                        cDTR.addItemListener(this);
                        pc.add(cDTR);    	
                  		
                  		pc.add(new Label("Nhay Cham"));
                  	    cRTS= new Checkbox();
                  		cRTS.addItemListener(this);
                  		pc.add(cRTS);    		
                  		
                  		pc.add(new Label("Light ON"));
                  	    on = new Checkbox();
                  		on.addItemListener(this);
                  		pc.add(on);    	    		    		    	        	                                          
                   	   setSize(500,350) ;    	   
                       	setResizable(false);     	
                      	addWindowListener(this);        
                                 
                      }
              public void RS232Control(){   
              	 try{   
              	    tx.append("\nTham so cai dat cong \nbaud:"+this.baud+" Bit: "+this.bit+" Bit Stop: "+this.stopbit+" Parity check:  "+this.parityBit);
              		serialPort.setSerialPortParams(this.baud,this.bit,this.stopbit,this.parityBit);		
              		}
              	catch(Exception UCOE)
              	       {    tx.append("\nCo loi xay ra khi thiet dat Tham co cong:");
              	            tx.append("\nBuoc dung tham so mac dinh");
              	            try{	            
              	                  serialPort.setSerialPortParams(9600,8,1,0);
              	                 }
              	            catch(UnsupportedCommOperationException UCOEx)                 {
              	            }
              	        }  	
              	       	       
                 try {       
                    tx.append("\nDang theo doi  "+portId.getName()+" voi tham so "+portId.getName()+"("+serialPort.getBaudRate()+","+
                    serialPort.getDataBits()+","+serialPort.getStopBits()+","+serialPort.getParity()+")");
                    serialPort.addEventListener(this);				
              	}
                catch (TooManyListenersException e) { tx.append("co loi xay ra tai cong");}         
              }      
              //public static void main(String[] args) {
              //        RS_232Frame frame = new RS_232Frame();        
              //        frame.setVisible(true);
              //    }
              public void run() {
              //     serialPort.addEventListener(this);
                     try {
                      Thread.sleep(1000);              
                     } catch (InterruptedException e) {}
                     this.notifyAll();
                  }  
              public void serialEvent(SerialPortEvent event) {	 
                      switch(event.getEventType()) {       
                      case SerialPortEvent.RI:
                                                            tx.append("\n RI");
                      case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
                      tx.append("\n DTR is false");     
                      break;
                      case SerialPortEvent.DATA_AVAILABLE:
                          byte[] readBuffer = new byte[20];
                                   tx.append("\n DSR is false");     
                          try {
                              while (inputStream.available() > 0) {
                                  int numBytes = inputStream.read(readBuffer);
                              }
                             tx.append(new String(readBuffer));
                          } catch (IOException e) {}
                          break;
                      }
                  }    
              public void windowDeactivated(WindowEvent e){}
              public void windowActivated(WindowEvent e){}
              public void windowDeiconified(WindowEvent e){}
              public void windowIconified(WindowEvent e){}
              public void windowClosed(WindowEvent e){
              	serialPort.close();
              	System.exit(0);
              	}
              public void windowClosing(WindowEvent e){
              	serialPort.close();
              	System.exit(0);
              	}
              public void windowOpened(WindowEvent e){}
              //phương thức xử lí sự kiện
              public void actionPerformed(ActionEvent e){	 
              	if(e.getSource()==open){	 	  	      
                    portList = CommPortIdentifier.getPortIdentifiers(); // kiem tra tai nguyen he thong luu vao mang OBJECT
                    portId = (CommPortIdentifier) portList.nextElement();
                    portId.addPortOwnershipListener(this);                
                    tx.setText(" ");  
                    while (portList.hasMoreElements()) 
                          {        
                            
                   //        {  //kiem tra xem co phai RS232 khong 
                              if (portId.getName().equals(port.getSelectedItem())) {     //nhan lai cong  da chon bang cach 
                                try {                 
                                    
                                    if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)  	                       
                                         serialPort = (SerialPort) portId.open("Nguyễn Tất Hùng", 2000);                                                                                                                           
                                   } catch (PortInUseException ex) {}
                                   close.setEnabled(true);                             	                                         
                                  break;                          
                              }                
                              else {                                                                     	                                              
                                         tx.append(portId.getName()+"\n");  
                                         portList.nextElement();                                       
                                      }                                  
                          if (portList.hasMoreElements()==false) 
                               {                 
                                tx.insert("Nhung cong co the mo duoc \n",0);                                                      
                                }                  
                  	}    	
                 }    
                 if(e.getSource()==control)    {   
                   tx.setText("") ;
                   if(portId.isCurrentlyOwned()){
                    	tx.append("\n Cho phep ban dieu khien cong da chon");       	
                          //chuyen no thanh dinh dang cong            
                          if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {  //kiem tra xem co phai RS232 khong 
                              if (portId.getName().equals(port.getSelectedItem())) {     //nhan lai cong  da chon bang cach so sanh
                              //neu cong ton tai thi goi phuong thuc de mo cong                                                   
                                    tx.append("\n           please wait..................");                                                         	                      
                                    this.RS232Control();
                              }
                          }          
                        }             
                   else{                       
                            tx.append("\nBan khong duoc phep dieu khien cong da chon");
                        }               
                      //        if (portId.getName().equals(port.getSelectedItem()))                            
                   }
                if(e.getSource()==close){       	    	               	             	            	                                       
                         if (portId.getName().equals(port.getSelectedItem())){           
                     	           	 tx.append("\n"+port.getSelectedItem()+" Se duoc dong lai ");         	             
                     	             close.enable(false);
                     	             open.enable(true);
                     	             baudChoice.enable(false);
                     	             byteChoice.enable(false);
                     	             parityChoice.enable(false);
                     	             stopChoice.enable(false);
                     	             serialPort.close(); 
                     	             }
                     	          else{          	        	                         	          
                            	     tx.append("\n Ban khong co quyen dong "+port.getSelectedItem()+" boi vi ");              	                   	                  	     
                            	     tx.append("\nBan dang so huu :"+portId.getName());
                     	         }           	             	    
                       }                  
              }
              public void itemStateChanged(ItemEvent e){	
              	  baud =Integer.parseInt(baudChoice.getSelectedItem());		
                    bit=Integer.parseInt(byteChoice.getSelectedItem());
               	  parityBit=parity[parityChoice.getSelectedIndex()];      	
              	  stopbit=stop[stopChoice.getSelectedIndex()];	  
              	  if ((e.getSource()==baudChoice )||
              	      (e.getSource()==byteChoice )||(e.getSource()==stopChoice)||(e.getSource()== parityChoice)){	 
                  	 try{   
              		serialPort.setSerialPortParams(baud,bit,stopbit,parityBit);
              	    	}
              	catch(Exception UCOE)
              	       {   tx.append("\nTham số cổng không hợp lệ hoặc công không mở");	}	
              	     }  	    	               
              	 if(e.getSource()== cDTR){	
                           cRTS.setEnabled(false);             
              	          int f=1;	         
              	          b.setIcon(sang);	      
              	    	while(cDTR.getState()==true && f<=300&&on.getState()==true )
              	       	    {	    	              	            	    	            	    	            	       	        	       	       
              	    	        serialPort.setDTR(true);	    	        
              	    	        serialPort.sendBreak(20);		    	       	    	        	    	        
              	    	        serialPort.setDTR(false);
              	    	        serialPort.sendBreak(20);		    	        
              	    	        f++;    	    	        	        		    	        	    	       
              	    	       }	    
              	    	    cDTR.setState(false);    	    	    
              	    	  }  	          	            		           	    	    	    	      	   
              	    if(e.getSource()== cRTS){	 
              	     	     		       	  	      	                   	       
              	        int f=1;	
              	        cDTR.setEnabled(false);         
              	          	b.setIcon(toi);	    	              	            	    	            	    	            	       
              	    	while(cRTS.getState()==true && f<=60 && on.getState()==true)
              	       	    {	       	  
              	    	        serialPort.setDTR(true);		      //tat den trang thai o  tich cuc  DTR=0V 	    	                                                              //khi tin hieu dieu khien 	    	        
              	    	        serialPort.sendBreak(100);		    	       	    	        
              	    	        serialPort.setDTR(false);            //bat den tich trang thai o tich cuc cuc  DTR = +5 	    	                                                             //trang thai mac dinh
              	    	        serialPort.sendBreak(100);	
              	    	        f++;    	        		    	        	    	       
              	    	       }	
              	    	     cRTS.setState(false) ;	    	    
              	    	 }    
              
              	      cDTR.setEnabled(true);               	   
              	      cRTS.setEnabled(true);	          	   
              	   }  
              public void ownershipChange(int var){
              	tx.setText("");
              	if (var==PORT_UNOWNED ){	
              	portId.getName();
              	tx.append("Dong  \""+port.getSelectedItem()+"\" thanh cong"+'\n'+"trang thai cong:");
              	tx.append(portId.getCurrentOwner()+'\n');
              	}	
              	if (var==PORT_OWNED){	//neu chuong trinh vua mo mot cong mo cong 
              	portId.getName();	
              	tx.append("Mo  \""+port.getSelectedItem()+"\" thanh cong \n trang thai cong:\n");
              	tx.append(portId.getName()+"  dang bi "+portId.getCurrentOwner()+" chiem giu \n");
              	open.setEnabled(false);
              	baudChoice.enable(true);
                  byteChoice.enable(true);
                  parityChoice.enable(true);
                  stopChoice.enable(true);
              	}	
              	if (var==PORT_OWNERSHIP_REQUESTED){	   //neu chuong trinh da mo duoc  cong nao do thi goi	
              	tx.append("\""+port.getSelectedItem()+"\" da co chuong trinh so huu \n");	
               	tx.append("Chuong trinh so huu : "+portId.getCurrentOwner()+"\n");
               	if(portId.isCurrentlyOwned())
               	   {
               	   	tx.append("Chuong  trinh cua ban dang chiem cong "+portId.getName()+" ban co the dong no");
               	   }
               	  else   
               	   tx.append(portId.getName()+" da bi chuong trinh nao do chiem ban khong the dong cong ");
                  }	 
              } 
              public void paint(Graphics g){}
              }
              Last edited by namqn; 31-08-2008, 19:45.

              Comment


              • #8
                còn đây là cái source của cái lớp MainControl.java cái lớp này chỉ chứa hàm main để gọi cái lớp RS_232Frame.java mà các bác đã dịch ở bên trên.cái này khi dùng phải tích hợp cái gói JAVA.COMM.* vào máy ảo JVM de JVM điều khiển và biên dịch mã nguồn trên nhé. Em đã dùng cái này để điều khiên một led ở cổng com qua chân DTR và các chân OUT cua RS232 rất OK nói chung cái chương trình này còn nhiều vấn đề cần phải bàn giao diện chưa đựoc đẹp lắm


                Code:
                package MainControl;
                public class MainControl{
                
                	/**
                	 * @param args
                	 */
                	public static void main(String[] args) {
                		// TODO Auto-generated method stub
                		RS_232Frame  winmain = new RS_232Frame();
                		winmain.setVisible(true);
                	}
                
                }
                he he nói thêm nhé về ETHENET chắc chắn là SUN sẽ hỗ trợ EThenet và TCP/IP trong JVM roi Lúc này chưa tìm hiểu bác nào có kinh nghiệm làm việc với cái gói java.usb thì chia sẻ kinh nghiệm cho em với nhé
                cái thằng java có điểm mạnh hơn các thằng khác nếu dung Luồng(THEAD) có thể điểu khiển để tạo trễ tới NS(nano giây) rất mạnh trong điều khiển hơn hẳn VB và các ngôn ngữ khác
                Hình như với TCP/IP chẳng cần thêm cái gì chỉ cần viết vài chương trình để tạo và làm việc với socket là có thể thoải mái để truyền thông theo kiểu TCP/IP hoặc UDP rồi vì Jdk đã có các gói để lập trình mạng
                import java.io.*;
                import java.net.*;
                thế là đủ cả rồi và đương nhiên ứng dụng viết ra sẽ Multi Flatform (windows, linux, mac ... đều chạy tất chỉ cần JVM là đủ
                em cho luôn cái ảnh lúc chạy thử của cái chương trình cùng mã nguồn của hai cái lớp kia lên đây cho các bác tha hồ download
                Attached Files
                Last edited by khoahung; 31-08-2008, 22:13.

                Comment


                • #9
                  OK em post cho các bác luôn cái goi java.comm.* bac nào không tim được gói này thì lấy ở đây nhé.còn việc tích hợp vào JVM là việc của các bác.em không giải thích đâu gói này dùng cho JVM của windows còn JVM của linux cũng tưong tự ở đây có đủ cả một cho windows còn một cho linux hình nhu cái gói cho linux dung luon cho ca MAC OS nua.viec cua các bác là tích hợp hai cái gói này để JVM có thể hiểu được và giao tiếp được với RS232 nhé,nó cũng cần cho JDK khi lập trình với LPT , RS232 vì nó là thư viện giao diện để lập trình cổng COM mà còn Ethenet hay các ngoại vi khác thì Jvm đã hỗ trợ hết rồi
                  lúc nào có thời gian se làm luôn mọt cái terminal bằng java luôn dạo này bận quá cái này làm lâu lắm rồi bye bye chúc các bác thành công
                  Attached Files
                  Last edited by khoahung; 31-08-2008, 22:27.

                  Comment


                  • #10
                    Nguyên văn bởi khoahung Xem bài viết
                    Lúc tối em post cai bài này liên đây vi phạm cái lỗi gì sao lại có cái 0 the vang/ 1 thẻ đỏ ở đây thế nhỉ.Hay là em không được post nhung cái thứ này lên forum hả.bác nào biết chỉ luôn cho em cách upload cái file đính kèm hay cái ảnh lên đây nhé
                    Bạn post liền 2 bài bằng tiếng Việt không dấu, như vậy là vi phạm quy định diễn đàn rồi (diễn đàn quy định viết bài bằng tiếng Việt có dấu).

                    Khi post bài (trong khung soạn thảo lớn), bạn sẽ thấy một khung khác gọi là "Các tùy chọn khác" nằm dưới các nút "Gửi trả lời" và "Xem trước" của khung soạn thảo. Trong khung phía dưới đó, bạn sẽ thấy cụm chức năng "Gửi kèm file" ở mục thứ hai. Nhấn nút "Tải file từ máy" để mở hộp thoại chọn file được upload, phần còn lại thì có lẽ không có gì khó hiểu.

                    Thân,
                    Biển học mênh mông, sức người có hạn

                    Comment


                    • #11
                      Chào các bác em đang muốn tạo ra một cái luồng mới thảo luận về lập trình JAVA đối với Các thiết bị phần cứng kiểu như USB RS232 VDK va MMC SD v..v.. nhưng chắc trình em còn thấp nên các bác có kinh nghiệm lập trình giao tiếp phần cứng bằng JAVA support cho em nhé nhất là bác ngô hải bắc và các Admin đã có kinh nghiêm làm giao tiếp với VC++ và VB thì support cho em làm nốt cái JAVA communication này nhé, vì nếu dùng đa hệ điều hành thì chắc chi có thằng này là khả thi nhất.em tạo ra các bác cổ vũ cho em nhé.chắc là giao tiếp trong LINUX WINDOWS và MAC OS cung không vấn đề gì khi viết bằng JAVA vì java nó là "Run any Where" ma (HIC HIC em sửa cái bài viết chữ không dấu đi bác Namqn bỏ cái thẻ đỏ kia đi cho em nhé nhìn trong kinh chết)

                      Comment


                      • #12
                        Thẻ phạt có thời hạn thôi mà bạn. Bạn không vi phạm gì nữa thì một thời gian sau cái thẻ nó tự biến mất thôi.

                        Thân,
                        Biển học mênh mông, sức người có hạn

                        Comment


                        • #13
                          Nguyên văn bởi khoahung Xem bài viết
                          các bác có kinh nghiệm lập trình giao tiếp phần cứng bằng JAVA support cho em nhé nhất là bác ngô hải bắc và các Admin đã có kinh nghiêm làm giao tiếp với VC++ và VB thì support cho em làm nốt cái JAVA communication này nhé, vì nếu dùng đa hệ điều hành thì chắc chi có thằng này là khả thi nhất.
                          Tớ không có kinh nghiệm về các món đó nên chỉ cổ vũ bằng tinh thần thôi. Nói chung tớ chủ yếu làm phần mềm thuần túy nhưng đôi lúc vẫn phải 'giao tiếp thiết bị', nên vào đây học hỏi.
                          Ý tưởng lấy Java để điều khiển thiết bị cũng có nhiều điểm hay/phù hợp.
                          Cảm ơn cậu về đoạn code nhé

                          Comment


                          • #14
                            À khoahung này. SUN không tiếp tục cung cấp gói comm cho Win, chỉ có cho Linux và Solaris. Vậy tính 'làm ăn lâu dài' có ổn không ?

                            Comment


                            • #15
                              cái gói javax.comm.* đã được sun cung cấp cho windows rồi mà
                              http://onesearch.sun.com/search/ones...&charset=UTF-8
                              Tôi nghĩ javax.comm.* mặc dù không được tích hợp vào JRE và không có trong bộ JDK nhưng tự bạn download nó về và cấu hình theo chỉ dẫ là được mà.còn muốn làm thêm các tính năng gì cho các ứng dụng dặc biệt với Rs-232 LPT của riêng bạn thì dùng JNI phát triển thêm các Native code có thể dùng C++ viết thêm các hàm Native Code được mà giống như người ta phát triển cái gói JUSB.* ấy.tui cũng chưa dùng hết năng lực của cái gói javax.comm.* này đâu tui thấy nó cũng có đủ hết các hàm làm việc với LPT và RS-232 rồi mà. còn javax.comm.* sun có cung cấp bản làm việc trên windows rồi
                              Last edited by khoahung; 19-09-2008, 12:41.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X