리눅스와 보드의 시리얼 통신에 관해..

soo026의 이미지

먼저..

pc 두대로.. ttyS0 끼리 통신이 되도록 구현을 했습니다.

간단하게 하나는 데이타를 주고, 하나는 데이타를 받는..

그리고나서.. 성공후에.. 다시..

PC 하나는.. 미니컴으로.. 보드를 컨트롤하구요..

PC 하나는.. 보드와 통신을 할껍니다.

원래는 pc - pc 통신였죠..(시리얼을 이용한..)

그 다음은 pc - board 통신을 할려고 합니다. 이때 pc 하나는 보드를 minicom 으로 컨트롤하죠..

그럼.. 일단 소스를 먼저..

==========================================
SimpleWrite.java
==========================================

import java.io.*;
import java.util.*;
import javax.comm.*;

public class SimpleWrite {
static Enumeration portList;
static CommPortIdentifier portId;
static String messageString = "Hello, world!\n";
static SerialPort serialPort;
static OutputStream outputStream;
static byte[] test;

public static void main(String[] args) throws Exception{
portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();

if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {

//if (portId.getName().equals("/dev/ttyS0")) {
System.out.println("\n" + portId.getName()+ "\n");

if (portId.getName().equals("/dev/ttyS2")) {

System.out.println("come in.. ^^");

try {
serialPort = (SerialPort)
portId.open("SimpleWriteApp", 2000);
} catch (PortInUseException e) { }

try {
outputStream = serialPort.getOutputStream();
} catch (IOException e) { }

try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}

try {

for(int j=0;j<100;j++){

int i = (int)(Math.random()*99+1);
String reply = Integer.toString(i);
outputStream.write(reply.getBytes());

System.out.println("write = " + reply);
Thread.sleep(500);

}
outputStream.write("END".getBytes());
System.out.println("END");
outputStream.close();
} catch (IOException e) {}

serialPort.close();

}
}
}
}
}

==========================================
SimpleRead.java
==========================================

import java.io.*;
import java.util.*;
import javax.comm.*;

public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;

InputStream inputStream;
SerialPort serialPort;
Thread readThread;

public static void main(String[] args) {
portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
//boolean a = portId.getName().equals("/dev/ttyS0");
//System.out.println(a);
if (portId.getName().equals("/dev/ttyS0")) {
//if (portId.getName().equals("COM1")) {
//if (portId.getName().equals("/dev/term/a")) {
SimpleRead reader = new SimpleRead();
}
}
}
}

public SimpleRead() {
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 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();
}

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:
byte[] readBuffer = new byte[20];
//int numBytes;

try {
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
byte[] result = trim(readBuffer, numBytes);
System.out.print(new String(result));

if(new String(result).equals("END")) {
serialPort.close();
break;
}
}
//byte[] result = trim(readBuffer, numBytes);
//System.out.print(new String(result));

//serialPort.close();

} catch (IOException e) {}
break;
}

}

public byte[] trim(byte[] data, int len){
byte[] data_t;

if(data.length>len){
data_t = new byte[len];

for(int i=0; i
data_t[i]=data[i];
}
return data_t;
}
else{
return data;
}
}/******************** trim END ***********************************/

}

==========================================

내용이 좀 길어 졌는데..

보드에선.. write 를.. PC 에선 read 를 합니다.

근데..

이렇게 돌려보면..

[root@TynuxBox_Ie open-wonka]$./wonka SimpleWrite
loading ficl O-O extensions
loading ficl utility classes
finished loading ficl softcore
Launched system thread, returning control to kernel
ok> ok> ok> ok> ok> ok>
Reading device configuration from file 'system/device.config'
ok> ok> Calling JNI_CreateJavaVM() ...
Init: looking up System property com.acunia.wonka.Init.linux.start
Init: start_class = class SimpleWrite
Init: will invoke public static void SimpleWrite.main(java.lang.String[]) throws java.lang.Exception of class SimpleWrite
Init: starting Garbage Collector
Init: starting Finalizer
Init: starting Heartbeat
Init: starting public static void SimpleWrite.main(java.lang.String[]) throws java.lang.Exception ...

stdin

stderr

stdout

java.lang.Runtime/exit called with status 0, running shutdown hooks.
Finished running shutdown hooks, goodnight.

보드에서 이런 메세지가 나옵니다.

그래서 system/device.config 의 내용을 보니깐..

( This file uses Forth syntax, so comments look like this. )

( For each device of type sio that you use, you need to specify the path )
( to the device on your platform. )
( attach-serial-device sio 0 /dev/ttyS0 )
( attach-serial-device sio 1 /dev/ttyS1 )
( attach-serial-device sio 2 /dev/ttyS2 )
( attach-serial-device sio 3 /dev/ttyS3 )

( Each register-serial-device command takes three parameters: the name of )
( the device, the "family" name of its driver, and a member number. )

( Register serial devices - remove the brackets round the ones you need. )
( register-serial-device sio0 sio 0 )
( register-serial-device sio1 sio 1 )
( register-serial-device sio2 sio 2 )
( register-serial-device sio3 sio 3 )

( Register standard Unix file descriptors )
register-serial-device stdin wfd 0
register-serial-device stdout wfd 1
register-serial-device stderr wfd 2

( Register standard internal devices. These are cloned on demand, )

( replacing the trailing underscore with the member number. )
( You need unzip_ to be able to read wre.jar ! )
register-serial-device unzip_ zip 0
register-serial-device zip_ zip 20
( register-serial-device loop_ loop 0 )

( The file pseudo-devices, mainly used for test purposes. There are )
( four of them, numbered 0 to 3. Set the name and then register. )
( set-file-name 0 temp/foo )
( set-file-name 1 temp/bar )
( set-file-name 2 temp/baz )
( set-file-name 3 temp/quux )
( register-serial-device file0 file 0 )
( register-serial-device file1 file 1 )
( register-serial-device file2 file 2 )
( register-serial-device file3 file 3 )

( Specify the mouse driver and path. Currently the first two parameters )
( are ignored. Only effective for framebuffer devices, not for X. )

attach-mouse-device touchscreen 0 /dev/ts

이렇더군요..

ㅠ.ㅠ 넘 길어져서 죄송합니다.. 자세히 쓸려고 하니..

암튼.. 먼가를 수정해야 할것 같은데..

몰라서요.. 이것 저것 고쳐 봤는데..

멀 고쳐야 하는지..

답변 부탁드립니다~~ ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.