자바 시리얼통신으로 받은 데이터 활용에 대해 질문드립니다.
글쓴이: qqkain / 작성시간: 월, 2013/05/20 - 10:17오후
아트메가128과의 시리얼통신을 통해 받은 "A"라는 문자를 길찾기 프로그램의 현재위치 입력으로 넣으려고 하는데
이 코드를 따로따로 동작은 하고 동시에 켤수는 있는데 위에 말한 부분에서 막혀서 몇주째 막혀있는 실정입니다.ㅠㅠ
고수님들의 조언 부탁드립니다.
코드와 실행결과 첨부합니다.
1. 시리얼통신 코드 import gnu.io.*; import java.io.*; import java.util.*; public class UARTCommunicator implements SerialPortEventListener { // 시리얼 관련 private Enumeration portList; private CommPortIdentifier portId; private SerialPort serialPort; // 시리얼 입출력 static OutputStream outputStream; // 요놈은 LED 클래스에서 마구잡이로 쓸것이기에 스테틱 private InputStream inputStream; // 시리얼 통신 설정 값 - 따로 설정창 만드는게 스마트 하지만 굳이 필요 없기에 그냥 때움 private String comPort = "COM7"; private int baud = 9600; private int dataBit = SerialPort.DATABITS_8 ; private int stopBit = SerialPort.STOPBITS_1; private int parity = SerialPort.PARITY_NONE; // 초기화 할 때 통신 설정 가능 public UARTCommunicator(String comPort, int baud, int dataBit, int stopBit, int parity) { this.comPort = comPort; this.baud = baud; this.dataBit = dataBit; this.stopBit = stopBit; this.parity = parity; } // 아무 초기값이 없으면 요놈으로 때움 public UARTCommunicator() { this("COM7", 9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } // 시리얼 포트 열기 - 엄청나게 에러 대비한 코드인데... 샘플 프로그램에서 그냥 퍼 오다 보니... public void openPort() { portList = CommPortIdentifier.getPortIdentifiers(); // 포트 리스트 쫙~~ 추가 while (portList.hasMoreElements()) // 포트가 있으면... { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) // 시리얼 포트이면... { if (portId.getName().equals(comPort)) // 설정 값과 같은 시리얼 포트이면... { // 포트 연결 try { serialPort = (SerialPort) portId.open("SerialPort", 2000); System.out.println(comPort + "포트가 연결 되었습니다."); } catch (PortInUseException e) { System.out.println("포트 초기화 에러"); } // IO 스트림 연결 try { outputStream = serialPort.getOutputStream(); inputStream = serialPort.getInputStream(); } catch (IOException e) { closePort(); // 오류가 났으니 일단 열린 포트 부터 닫고... System.out.println("IO 초기화 에러"); } // 포트 설정 try { serialPort.setSerialPortParams(baud, dataBit, stopBit, parity); } catch (UnsupportedCommOperationException e) { closePort(); // 오류가 났으니 일단 열린 포트 부터 닫고... System.out.println("시리얼 포트 초기화 에러"); } // 입력 데이터가 있으면 이벤트를 발생 한다. try { serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); } catch (TooManyListenersException e) { closePort(); // 오류가 났으니 일단 열린 포트 부터 닫고... System.out.println("listeners가 너무 많습니다."); } } // if (portId.getName().equals(comPort)) } // if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) } // while (portList.hasMoreElements()) } // public void openPort() // 시리얼 포트 닫기 public void closePort() { serialPort.close(); System.out.println(comPort + "포트가 닫혔습니다."); } // RX에 관한 이벤트가 발생 했을때... - 역시 그냥 가지고 와서 수정... public void serialEvent(SerialPortEvent e) { int newData = 0; byte[] readBuffer = new byte[10]; // 원하는 데이터를 추출 한다. while (newData != -1) { try { newData = inputStream.read(); // 새 데이터가 없는 경우 - 이런 경우가 있을까? if (newData == -1) { System.out.println("RX 이벤트가 발생 했는데 뭔가 이상함..."); return; } while (inputStream.available() > 0) { int numBytes = inputStream.read(readBuffer); } System.out.print(new String(readBuffer)); } catch (IOException ex) { System.out.println(ex); } } } public void rx(char data) { try { outputStream.write(data); System.out.println("데이터 송신"); } catch(IOException e) { System.out.println("IO 초기화 에러"); } } } 2. 길찾기 프로그램 코드 import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; class ShortPath { int path[] = new int[9]; // 최단경로 저장 public static int input(String in) // 입력받은 문자열을 숫자로 변경하여 반환 { if (in.equals("1") || in.equals("강남역")) return 1; else if (in.equals("2") || in.equals("미스터피자")) return 2; else if (in.equals("3") || in.equals("미즈컨테이너")) return 3; else if (in.equals("4") || in.equals("스타벅스")) return 4; else if (in.equals("5") || in.equals("편의점")) return 5; else if (in.equals("6") || in.equals("와라와라")) return 6; else if (in.equals("7") || in.equals("이마트")) return 7; else if (in.equals("8") || in.equals("오빠닭")) return 8; else if (in.equals("9") || in.equals("순복음교회")) return 9; return 10; // 잘못된 입력일때 10반환 } public static char Path(int a) // 출력을 위해 숫자를 문자로 변환하여 출력 { switch (a) { case 0: return '1'; case 1: return '2'; case 2: return '3'; case 3: return '4'; case 4: return '5'; case 5: return '6'; case 6: return '7'; case 7: return '8'; case 8: return '9'; } return 0; } public String processing(String s, String e) throws Exception { int X = 1000; // 경로가 없을 때 최대값으로 지정. int array[][] = // 경로입력 { { 0, 51, 126, 163, 194, 129, 183, 216, 260 }, { 51, 0, 64, 101, 130, 70, 117, 149, 207 }, { 126, 64, 0, 67, 68, 72, 67, 102, 151 }, { 163, 101, 67, 0, 44, 149, 133, 120, 180 }, { 194, 130, 68, 44, 0, 150, 136, 126, 181 }, { 129, 70, 72, 149, 150, 0, 69, 99, 156 }, { 183, 117, 67, 133, 136, 69, 0, 42, 86 }, { 216, 149, 102, 120, 126, 99, 42, 0, 59 }, { 260, 207, 151, 180, 181, 156, 86, 59, 0 } }; int size = 9; // 지점의 수, 배열의 크기; int i, j, k = 0; String start_str; String end_str; int start, end; String ret = ""; while (true) { // BufferedReader br = new BufferedReader(new // InputStreamReader(System.in)); // 사용자로 부터 문자를 입력받는다. start_str = s; start = input(start_str); // 입력받은 문자열을 숫자로 바꾸어 start에 저장 end_str = e; end = input(end_str); // 입력받은 문자열을 숫자로 바꾸어 end에 저장 if (start == 10 || end == 10) // A~F까지의 문자를 입력받지 못했다면 다시 입력; { return "잘못 입력하였습니다."; // continue; // 잘못 입력시 처음으로 돌아간다. } break; // A~F사이의 문자를 입력했을 시 while문을 빠져나간다. } int distance[] = new int[9]; int check[] = new int[9]; for (j = 0; j < size; j++) // 초기화 { check[j] = 0; distance[j] = X; } distance[start - 1] = 0; // 출발점의 거리를 0으로 초기화 check[start - 1] = 0; // 출발점을 다시 지나치지 않기 위해 O으로 초기화 int via[] = new int[9]; int min; // 최단 거리를 저장. for (i = 0; i < size; i++) { min = X; for (j = 0; j < size; j++) { if (check[j] == 0 && min > distance[j]) // 아직 최소값이 지정되지 않았고 { // distance값이 min보다 작을경우 k = j; min = distance[j]; // distance값을 min에 저장 } } check[k] = 1; // 최소값이 지정된곳을 다시 검사하지 않도록 check 1을 저장 for (j = 0; j < size; j++) { if (distance[j] > distance[k] + array[k][j]) { distance[j] = distance[k] + array[k][j]; via[j] = k; } } } ret += "\n" + "[" + start_str + " -> " + end_str + "]" + "\n거리 : " + distance[end - 1] + "m\n"; k = end - 1; int path_cnt = 0; while (true) { path[path_cnt++] = k; // 최단 경로를 Path[]에 역순으로 저장한다. if (k == start - 1) break; // k가 시작값과 같으면 빠져나간다. k = via[k]; } ret += "경로는 : \n"; for (i = path_cnt - 1; i >= 1; i--) // path[]에 저장된 경로를 끝에서부터 출력 { ret += Path(path[i]) + " -> "; } ret += Path(path[i] + i) + "입니다.\n"; // 도착지점을 출력 return ret; } } public class levy2 extends JFrame implements ActionListener { int x, y, z; Color color; JTextArea Search; JTextArea Result; JTextField t1; JTextField t2; JTextField t3; public String s; public String s1; public String s2; JButton btnGoal; JButton btnRoad; JButton btnExit; JButton btnCheck; JPanel pnlField; JPanel pnlCenter; Image back; Image Image1; Image Image2; Image Image3; Image Image4; Image Image5; Image Image6; Image Image7; Image Image8; Image Image9; Image Imagesmile; Image Imagestart; Image Imagefinish; levy2(String title) { super(title); this.init(); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void init() { back = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/psy.jpg"); Image1 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/1.png"); Image2 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/2.png"); Image3 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/3.png"); Image4 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/4.png"); Image5 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/5.png"); Image6 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/6.png"); Image7 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/7.png"); Image8 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/8.png"); Image9 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/9.png"); Imagesmile = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/smile1.png"); Imagestart = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/start.jpg"); Imagefinish = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/finish.jpg"); Search = new JTextArea(34,68) { public void paint(Graphics g) { g.drawImage(back, 0, 0, this); g.drawImage(Image1, 61, 314, 23, 23, this); g.drawImage(Image2, 188, 289, 23, 23, this); g.drawImage(Image3, 329, 234, 23, 23, this); g.drawImage(Image4, 440, 365, 23, 23, this); g.drawImage(Image5, 518, 295, 23, 23, this); g.drawImage(Image6, 265, 110, 23, 23, this); g.drawImage(Image7, 394, 79, 23, 23, this); g.drawImage(Image8, 499, 119, 23, 23, this); g.drawImage(Image9, 575, 46, 23, 23, this); super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; drawPoint(g2); if ((x > 61 && x < 81) && (y > 314 && y < 334)) { g.setColor(new Color(255, 255, 200)); g.fillRect(41, 284, 40, 20); g.setColor(Color.BLACK); g.drawRect(41, 284, 40, 20); g.drawString("강남역", 41, 299); } if ((x>188 && x<208) && (y>289 && y<309)) { g.setColor(new Color(255, 255, 200)); g.fillRect(168, 259, 60, 20); g.setColor(Color.BLACK); g.drawRect(168, 259, 60, 20); g.drawString("미스터피자", 168, 274); } if ((x>329 && x<349) && (y>234 && y<254)) { g.setColor(new Color(255, 255, 200)); g.fillRect(309, 204, 72, 20); g.setColor(Color.BLACK); g.drawRect(309, 204, 72, 20); g.drawString("미즈컨테이너", 309, 219); } if ((x>440 && x<463) && (y>365 && y<388)) { g.setColor(new Color(255, 255, 200)); g.fillRect(420, 335, 49, 20); g.setColor(Color.BLACK); g.drawRect(420, 335, 49, 20); g.drawString("스타벅스", 420, 350); } if ((x>518 && x<538) && (y>295 && y<315)) { g.setColor(new Color(255, 255, 200)); g.fillRect(498, 265, 40, 20); g.setColor(Color.BLACK); g.drawRect(498, 265, 40, 20); g.drawString("편의점", 498, 280); } if ((x>265 && x<285) && (y>110 && y<130)) { g.setColor(new Color(255, 255, 200)); g.fillRect(245, 80, 49, 20); g.setColor(Color.BLACK); g.drawRect(245, 80, 49, 20); g.drawString("와라와라", 245, 95); } if ((x>394 && x<414) && (y>79 && y<99)) { g.setColor(new Color(255, 255, 200)); g.fillRect(374, 49, 40, 20); g.setColor(Color.BLACK); g.drawRect(374, 49, 40, 20); g.drawString("이마트", 374, 64); } if ((x>499 && x<519) && (y>119 && y<139)) { g.setColor(new Color(255, 255, 200)); g.fillRect(479, 89, 40, 20); g.setColor(Color.BLACK); g.drawRect(479, 89, 40, 20); g.drawString("오빠닭", 479, 104); } if ((x>575 && x<595) && (y>46 && y<66)) { g.setColor(new Color(255, 255, 200)); g.fillRect(555, 16, 60, 20); g.setColor(Color.BLACK); g.drawRect(555, 16, 60, 20); g.drawString("순복음교회", 555, 31); } } { // 마우스 리스너(이벤트) addMouseListener(new Click()); setLocation(50, 100); setVisible(true); } public void drawPoint(Graphics2D g2) { // 그래픽을 좀더 부드럽게 함. g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } class Click extends MouseAdapter { public void mouseClicked(MouseEvent e) { x = e.getX(); y = e.getY(); repaint(); } } }; Search.setOpaque(false); Result = new JTextArea(34, 23); Search.setEditable(false); Result.setEditable(false); Result.setText(" 경로 안내"); // 필드 t1 = new JTextField(20); t2 = new JTextField(20); t3 = new JTextField(1); t1.addActionListener(this); t2.addActionListener(this); t3.addActionListener(this); // 버튼 btnGoal = new JButton("목적지 검색"); btnRoad = new JButton("경로 안내"); btnCheck = new JButton("체크"); btnExit = new JButton("나가기"); btnGoal.addActionListener(this); btnRoad.addActionListener(this); btnCheck.addActionListener(this); btnExit.addActionListener(this); pnlCenter = new JPanel(); pnlField = new JPanel(); // JScrollPane jp = new JScrollPane(Search); // jp.setOpaque(false); pnlCenter.add(new JScrollPane(Search)); pnlCenter.add(Result); pnlCenter.setOpaque(false); pnlField.add(t1); pnlField.add(t2); pnlField.add(t3); pnlField.add(btnGoal); pnlField.add(btnRoad); pnlField.add(btnCheck); pnlField.add(btnExit); this.setBounds(10, 10, 1200, 700); this.getContentPane().add(pnlCenter, BorderLayout.CENTER); this.getContentPane().add(pnlField, BorderLayout.SOUTH); this.getContentPane().add(new JScrollPane(pnlCenter)); Result.setBackground(Color.LIGHT_GRAY); btnGoal.setBackground(Color.CYAN); btnRoad.setBackground(Color.PINK); btnCheck.setBackground(Color.RED); btnExit.setBackground(Color.ORANGE); this.setVisible(true); back = back.getScaledInstance(Search.getWidth(), Search.getHeight(), Image.SCALE_DEFAULT); UARTCommunicator uart = new UARTCommunicator(); uart.openPort(); } public void actionPerformed(ActionEvent ae) { ShortPath z = new ShortPath(); if (ae.getSource() == t1) { s = t1.getText(); } if (ae.getSource() == t2) { s1 = t2.getText(); } if (ae.getSource() == t3) { s2 = t3.getText(); } if (ae.getSource() == btnRoad) { try { Result.setText(" 경로 안내\n"); Result.append(z.processing(t1.getText(), t2.getText())); } catch (Exception ae1) { ae1.printStackTrace(); } } else if (ae.getSource() == btnExit) { System.exit(0); } Object o = ae.getSource(); JFileChooser ch = new JFileChooser(); if (o == t1) { // JTextField창에 글자를 입력했을시 JTextArea 창에 출력 Search.append(t1.getText() + "\n"); // 글자 입력을 초기화 t1.setText(""); } else if (o == btnGoal) { Result.setText(" 목적지 검색\n1. 강남역\n2. 미스터피자\n3. 미즈컨테이너\n4. 스타벅스\n5. 편의점\n6. 와라와라\n7. 이마트\n8. 오빠닭\n9. 순복음교회"); } else if (o == btnRoad) { Image1 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/1.png"); Image2 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/2.png"); Image3 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/3.png"); Image4 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/4.png"); Image5 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/5.png"); Image6 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/6.png"); Image7 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/7.png"); Image8 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/8.png"); Image9 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/9.png"); { if(t1.getText().equals("1")||t1.getText().equals("강남역")) Image1 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/start.jpg"); else if(t1.getText().equals("2")||t1.getText().equals("미스터피자")) Image2 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/start.jpg"); else if(t1.getText().equals("3")||t1.getText().equals("미즈컨테이너")) Image3 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/start.jpg"); else if(t1.getText().equals("4")||t1.getText().equals("스타벅스")) Image4 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/start.jpg"); else if(t1.getText().equals("5")||t1.getText().equals("편의점")) Image5 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/start.jpg"); else if(t1.getText().equals("6")||t1.getText().equals("와라와라")) Image6 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/start.jpg"); else if(t1.getText().equals("7")||t1.getText().equals("이마트")) Image7 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/start.jpg"); else if(t1.getText().equals("8")||t1.getText().equals("오빠닭")) Image8 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/start.jpg"); else if(t1.getText().equals("9")||t1.getText().equals("순복음교회")) Image9 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/start.jpg"); repaint(); } { if(t2.getText().equals("1")||t2.getText().equals("강남역")) Image1 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/finish.jpg"); else if(t2.getText().equals("2")||t2.getText().equals("미스터피자")) Image2 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/finish.jpg"); else if(t2.getText().equals("3")||t2.getText().equals("미즈컨테이너")) Image3 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/finish.jpg"); else if(t2.getText().equals("4")||t2.getText().equals("스타벅스")) Image4 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/finish.jpg"); else if(t2.getText().equals("5")||t2.getText().equals("편의점")) Image5 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/finish.jpg"); else if(t2.getText().equals("6")||t2.getText().equals("와라와라")) Image6 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/finish.jpg"); else if(t2.getText().equals("7")||t2.getText().equals("이마트")) Image7 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/finish.jpg"); else if(t2.getText().equals("8")||t2.getText().equals("오빠닭")) Image8 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/finish.jpg"); else if(t2.getText().equals("9")||t2.getText().equals("순복음교회")) Image9 = getToolkit().getImage("C:/Users/카인/Desktop/새 폴더/캡스/길찾기프로그램/finish.jpg"); repaint(); } } String paths = null; try { paths = z.processing("t1.getText()", "t2.getText()"); } catch (Exception e) { e.printStackTrace(); } if (o == btnCheck) { Result.setText(" 경로 안내\n"); try { Result.setText(" 경로 안내\n"); Result.append(z.processing(t1.getText(), t2.getText())); } catch (Exception ae1) { ae1.printStackTrace(); } String insert1 = t1.getText(); String insert2 = t2.getText(); String insert3 = t3.getText(); int insertnum1 = Integer.parseInt(insert1); int insertnum2 = Integer.parseInt(insert2); int insertnum3 = Integer.parseInt(insert3); for (int i = 0; i <= z.path.length; i++) { if(insertnum3 == 1) { if(insertnum1 != 1 && insertnum2 != 1) { Result.setText(" 최단경로를 벗어났습니다.\n"); } } if (i == z.path.length) { Result.setText(" 최단경로를 벗어났습니다.\n"); } else if (z.path[i] == insertnum3-1) { break; } } } } public static void main(String[] args) { new levy2("길찾기 프로그램"); } }
File attachments:
첨부 | 파일 크기 |
---|---|
![]() | 247.33 KB |
Forums:
댓글 달기