Search

'통신'에 해당되는 글 4건

  1. 2014.03.08 MFC 시리얼 통신 클래스
  2. 2014.03.02 아두이노 & CPP 시리얼 통신 연동
  3. 2013.04.28 JAVA MYSQL ANDROID REST 활용
  4. 2012.11.17 JAVA TCP 통신 예제

MFC 시리얼 통신 클래스

Programming/C,CPP,CS 2014. 3. 8. 15:39 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

컴퓨터에서 시리얼 통신을 하려면 보통 터미널 프로그램을 사용하게 됩니다.

하지만 이 경우 용도가 매우 제한 되고 활용도가 떨어지죠.

이 시점에서 보통 Visual C++ MFC나 Visual Basic 쪽으로 눈을 돌려보게 되는데, 많은 DLL 파일들이나 프레임워크를 동반해야 되는 VB 프로젝트는 왠지 맘에 안들더군요. 

시리얼 통신 클래스는 하나 포스트해 두려고 합니다.

이 클래스는 몇년전에 인터넷 어디에서 구한 소스인데 프로젝트의 중요한 부분을 손데거나 클래스 내부에서 사용되는 변수들이 프로젝트 밖에 선언되어있는 경우가 있어서 나름 제 방식데로 수정한 버전입니다.

현재 컴퓨터에 연결된 컴포트를 검색해 주는 함수도 하나 추가했구요. 출처가 기억이 안나서 출처를 쓸 수가 없네요;; 


첨부된 Readme.txt 파일을 참고해서 사용하시면 되겠습니다. 

위 파일은 이 클래스를 이용해 만들어 본 시리얼 통신 체팅 입니다. 컴두대를 이용해서 확인해보셔도 되고, 루프백 이용해서 확인해 보셔도 됩니다. 
Visual Studio 2010 Pro 에서 컴파일 되었습니다.




출처 : http://magicom9.tistory.com/54


'Programming > C,CPP,CS' 카테고리의 다른 글

아두이노와 연계한 CPP 시리얼 통신 응용  (0) 2014.03.08
CString Convert 변환  (0) 2014.03.08
아두이노 & CPP 시리얼 통신 연동  (0) 2014.03.02
아두이노 기본 세팅  (0) 2014.03.02
CPP 연산자 오버로딩  (0) 2014.01.16
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

아두이노 & CPP 연동


출처 : http://playground.arduino.cc/Interfacing/CPPWindows#.UxLbvuN_uSo




SerialClass.h

#ifndef SERIALCLASS_H_INCLUDED
#define SERIALCLASS_H_INCLUDED

#define ARDUINO_WAIT_TIME 2000

#include 
#include 
#include 

class Serial
{
    private:
        //Serial comm handler
        HANDLE hSerial;
        //Connection status
        bool connected;
        //Get various information about the connection
        COMSTAT status;
        //Keep track of last error
        DWORD errors;

    public:
        //Initialize Serial communication with the given COM port
        Serial(char *portName);
        //Close the connection
        //NOTA: for some reason you can't connect again before exiting
        //the program and running it again
        ~Serial();
        //Read data in a buffer, if nbChar is greater than the
        //maximum number of bytes available, it will return only the
        //bytes available. The function return -1 when nothing could
        //be read, the number of bytes actually read.
        int ReadData(char *buffer, unsigned int nbChar);
        //Writes data from a buffer through the Serial connection
        //return true on success.
        bool WriteData(char *buffer, unsigned int nbChar);
        //Check if we are actually connected
        bool IsConnected();


};

#endif // SERIALCLASS_H_INCLUDED
SerialClass.cpp
#include "SerialClass.h"

Serial::Serial(char *portName)
{
    //We're not yet connected
    this->connected = false;

    //Try to connect to the given port throuh CreateFile
    this->hSerial = CreateFile(portName,
            GENERIC_READ ,
            0,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);

    //Check if the connection was successfull
    if(this->hSerial==INVALID_HANDLE_VALUE)
    {
        //If not success full display an Error
        if(GetLastError()==ERROR_FILE_NOT_FOUND){

            //Print Error if neccessary
            printf("ERROR: Handle was not attached. Reason: %s not available.\n", portName);

        }
        else
        {
            printf("ERROR!!!");
        }
    }
    else
    {
        //If connected we try to set the comm parameters
        DCB dcbSerialParams = {0};

        //Try to get the current
        if (!GetCommState(this->hSerial, &dcbSerialParams))
        {
            //If impossible, show an error
            printf("failed to get current serial parameters!");
        }
        else
        {
            //Define serial connection parameters for the arduino board
            dcbSerialParams.BaudRate=CBR_9600;
            dcbSerialParams.ByteSize=8;
            dcbSerialParams.StopBits=ONESTOPBIT;
            dcbSerialParams.Parity=NOPARITY;

             //Set the parameters and check for their proper application
             if(!SetCommState(hSerial, &dcbSerialParams))
             {
                printf("ALERT: Could not set Serial Port parameters");
             }
             else
             {
                 //If everything went fine we're connected
                 this->connected = true;
                 //We wait 2s as the arduino board will be reseting
                 Sleep(ARDUINO_WAIT_TIME);
             }
        }
    }

}

Serial::~Serial()
{
    //Check if we are connected before trying to disconnect
    if(this->connected)
    {
        //We're no longer connected
        this->connected = false;
        //Close the serial handler
        CloseHandle(this->hSerial);
    }
}

int Serial::ReadData(char *buffer, unsigned int nbChar)
{
    //Number of bytes we'll have read
    DWORD bytesRead;
    //Number of bytes we'll really ask to read
    unsigned int toRead;

    //Use the ClearCommError function to get status info on the Serial port
    ClearCommError(this->hSerial, &this->errors, &this->status);

    //Check if there is something to read
    if(this->status.cbInQue>0)
    {
        //If there is we check if there is enough data to read the required number
        //of characters, if not we'll read only the available characters to prevent
        //locking of the application.
        if(this->status.cbInQue>nbChar)
        {
            toRead = nbChar;
        }
        else
        {
            toRead = this->status.cbInQue;
        }

        //Try to read the require number of chars, and return the number of read bytes on success
        if(ReadFile(this->hSerial, buffer, toRead, &bytesRead, NULL) && bytesRead != 0)
        {
            return bytesRead;
        }

    }

    //If nothing has been read, or that an error was detected return -1
    return -1;

}


bool Serial::WriteData(char *buffer, unsigned int nbChar)
{
    DWORD bytesSend;

    //Try to write the buffer on the Serial port
    if(!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0))
    {
        //In case it don't work get comm error and return false
        ClearCommError(this->hSerial, &this->errors, &this->status);

        return false;
    }
    else
        return true;
}

bool Serial::IsConnected()
{
    //Simply return the connection status
    return this->connected;
}
main.cpp
#include 
#include 
#include "SerialClass.h"	// Library described above
#include 

// application reads from the specified serial port and reports the collected data
int main(int argc, _TCHAR* argv[])
{
	printf("Welcome to the serial test app!\n\n");

	Serial* SP = new Serial("\\\\.\\COM3");    // adjust as needed

	if (SP->IsConnected())
		printf("We're connected");

	char incomingData[256] = "";			// don't forget to pre-allocate memory
	//printf("%s\n",incomingData);
	int dataLength = 256;
	int readResult = 0;
	FILE *f;
	f = fopen("TempData.txt","w");

	while(SP->IsConnected())
	{
		readResult = SP->ReadData(incomingData,dataLength);
		//		printf("Bytes read: (-1 means no data available) %i\n",readResult);

		std::string test(incomingData);

		printf("%s",incomingData);

		char* token = strtok(incomingData, " ");
		while (token!=NULL) {
			fprintf(f,"\t%s",token);
			token = strtok(NULL, " ");
		}
		
		// strtok // token
		test = "";

		Sleep(1000);
	}
	fclose(f);
	return 0;
}

'Programming > C,CPP,CS' 카테고리의 다른 글

CString Convert 변환  (0) 2014.03.08
MFC 시리얼 통신 클래스  (0) 2014.03.08
아두이노 기본 세팅  (0) 2014.03.02
CPP 연산자 오버로딩  (0) 2014.01.16
CPP 연산자 오버로딩  (0) 2014.01.16

JAVA MYSQL ANDROID REST 활용

Programming/JAVA,JSP 2013. 4. 28. 17:15 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
REST 사용방법 http://192.168.0.3:8182/books http://192.168.0.3:8182/books/where/OReilly http://192.168.0.3:8182/books/ insert/"제목"/"저자"/"가격' REST 서버
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.restlet.Application;
import org.restlet.Request;
import org.restlet.Response;
import org.restlet.Restlet;
import org.restlet.Server;
import org.restlet.data.MediaType;
import org.restlet.data.Protocol;
import org.restlet.routing.Router;

public class test extends Application {
	public static Connection makeConnection() {
		String url = "jdbc:mysql://localhost:3307/book_db";
		String id = "root";
		String password = "green";
		Connection con = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println("드라이버 적재 성공");
			con = DriverManager.getConnection(url, id, password);
			System.out.println("데이터베이스 연결 성공");
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버를 찾을 수 없습니다.");
		} catch (SQLException e) {
			System.out.println("연결에 실패하였습니다.");
		}
		return con;
	}

	public static Statement stmt;

	public static void main(String[] args) throws Exception {
		Connection con = makeConnection();
		stmt = con.createStatement();
		Server server = new Server(Protocol.HTTP, 8182);
		server.setNext(new test());
		server.start();
	}

	public static String selectBooks(Statement stmt) throws SQLException {
		ResultSet rs = stmt.executeQuery("SELECT * FROM books");
		String result = "";
		while (rs.next()) {
			int id = rs.getInt("book_id");
			String title = rs.getString("title");
			String publisher = rs.getString("publisher");
			String year = rs.getString("year");
			if (title != null) {
				result += id + " " + title + " " + publisher + " " + year
						+ "\n";
			}
		}
		return result;
	}

	public static String selectBooks(Statement stmt, String name)
			throws SQLException {
		ResultSet rs = stmt
				.executeQuery("SELECT * FROM books WHERE publisher = '" + name
						+ "'");
		String result = "";
		while (rs.next()) {
			int id = rs.getInt("book_id");
			String title = rs.getString("title");
			String publisher = rs.getString("publisher");
			String year = rs.getString("year");
			if (title != null) {
				result += id + " " + title + " " + publisher + " " + year
						+ "\n";
			}
		}
		return result;
	}

	@Override
	public Restlet createInboundRoot() {
		Router router = new Router();
		router.attach("http://localhost:8182/books", restlet1);
		router.attach("http://localhost:8182/books/where/{name}", restlet2);
		router.attach(
				"http://localhost:8182/books/insert/{title}/{publisher}/{year}/{price}",
				restlet3);
		router.attach("http://localhost:8182/datas/{year}/{month}/{day}",
				restlet4);
		router.attach("http://192.168.0.3:8182/books", restlet1);
		router.attach("http://192.168.0.3:8182/books/where/{name}", restlet2);
		router.attach(
				"http://192.168.0.3:8182/books/insert/{title}/{publisher}/{year}/{price}",
				restlet3);
		router.attach("http://192.168.0.3:8182/datas/{year}/{month}/{day}",
				restlet4);
		// (title, publisher, year, price)
		return router;
	}

	public Restlet restlet4 = new Restlet(getContext()) {
		@Override
		public void handle(Request request, Response response) {
			// Print the user name of the requested orders
			String year = (String) request.getAttributes().get("year");
			String month = (String) request.getAttributes().get("month");
			String day = (String) request.getAttributes().get("day");

			String message = "";
			try {
				message += selectDatas(stmt, year, month, day);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			response.setEntity(message, MediaType.TEXT_PLAIN);
		}
	};

	public static String selectDatas(Statement stmt, String year, String month,
			String day) throws SQLException {
		ResultSet rs = stmt.executeQuery("SELECT * FROM datas WHERE year = "
				+ year + " && month =" + month + "&& day=" + day + ";");
		String result = "";
		while (rs.next()) {
			int id = rs.getInt("data_id");
			String contents = rs.getString("contents");
			if (contents != null) {
				result += id + " " + year + " " + month + " " + day + " "
						+ contents + "\n";
			}
		}
		return result;
	}

	public Restlet restlet3 = new Restlet(getContext()) {
		@Override
		public void handle(Request request, Response response) {
			// Print the user name of the requested orders
			String title = (String) request.getAttributes().get("title");
			String publisher = (String) request.getAttributes()
					.get("publisher");
			String year = (String) request.getAttributes().get("year");
			String price = (String) request.getAttributes().get("price");
			try {
				insertBooks(stmt, title, publisher, year, price);
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			String message = "";
			try {
				message += selectBooks(stmt);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			response.setEntity(message, MediaType.TEXT_PLAIN);
		}

		private void insertBooks(Statement stmt, String title,
				String publisher, String year, String price)
				throws SQLException {
			// TODO Auto-generated method stub
			// INSERT INTO books (title, publisher, year, price)
			// VALUES('Operating System Concepts', 'Wiley', '2003', 30700);
			stmt.execute("INSERT INTO books (title, publisher, year, price)"
					+ "VALUES('" + title + "','" + publisher + "','" + year
					+ "'," + price + ");");
		}
	};

	public Restlet restlet2 = new Restlet(getContext()) {
		@Override
		public void handle(Request request, Response response) {
			// Print the user name of the requested orders
			String name = (String) request.getAttributes().get("name");
			String message = "";
			try {
				message += selectBooks(stmt, name);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			response.setEntity(message, MediaType.TEXT_PLAIN);
		}
	};
	public Restlet restlet1 = new Restlet() {
		public void handle(Request request, Response response) {
			String message = "";
			try {
				message += selectBooks(stmt);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			response.setEntity(message, MediaType.TEXT_PLAIN);
		}
	};
}

'Programming > JAVA,JSP' 카테고리의 다른 글

JAVA JNI  (0) 2013.05.01
Eclipse Tips  (0) 2013.04.30
JAVA MYSQL 활용 4 Android App  (0) 2013.04.28
JAVA MYSQL 활용 3  (0) 2013.04.28
MYSQL REST 실습 코드 2  (0) 2013.04.28

JAVA TCP 통신 예제

Programming/JAVA,JSP 2012. 11. 17. 15:23 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


EchoServer.java

package socket.echo;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.net.ServerSocket;    //ServerSocket 클래스는 TCP서버소켓을 의미한다.
import java.net.Socket;


public class EchoServer {

 private BufferedReader bufferR;
 private BufferedWriter bufferW;
 private InputStream is;
 private OutputStream os;
 private ServerSocket serverS;

 
 public EchoServer(int port){
  
  try{
   //ServerSocket 객체를 3000번 포트를 이용하여 생성.
   serverS = new ServerSocket(port);
  }catch(IOException ioe){
   ioe.printStackTrace();
   System.exit(0);
  }
 
  while(true){
    
    try{
       System.out.println("클라이언트의 요청을 기다리는 중");
    
//accept() 메서드를 이용하여 클라이언트의 TCP커넥션(클라이언트에서 Socket객체를 생성하는 것)을 기다리고 있다.
//accept() 메서드는 클라이언트의 Socket객체가 생성될 때까지 블로킹 되고 있다가 클라이언트의 Socket객체가 생성되면 서버에서 클라이언트와 통신할 수 있는 Socket 객체를 리턴하게 된다.
//accept() 메서드의 유효시간이 지나면 java.net.SocketTimeoutException이 발생하는데, 이 예외가 발생하더라도 ServerSocket객체는 계속 유효하다.
//실험결과 accept() 메서드가 Socket 객체를 리턴하지 않는 한 while문의 루프도 돌아가지 않았다.
    Socket tcpSocket = serverS.accept();
    System.out.println("클라이언트의 IP주소 : "+tcpSocket.getInetAddress().getHostAddress());
    is = tcpSocket.getInputStream();     //'소켓으로부터' 읽고
    os = tcpSocket.getOutputStream();  //'소켓에' 쓴다.
    bufferR = new BufferedReader(new InputStreamReader(is));
    bufferW = new BufferedWriter(new OutputStreamWriter(os));
    String message = bufferR.readLine();
    System.out.println("수신메시지 : "+message);
    message += System.getProperty("line.separator");  //엔터키넣기
    bufferW.write(message);
    bufferW.flush();
    bufferR.close();
    bufferW.close();
    tcpSocket.close();
    
   }catch(IOException ie){
    ie.printStackTrace();
   }
   
  }
 
 }
 
 
 public static void main(String[] args){
    new EchoServer(3000);
 }
  
}





EchoClient.java

package socket.echo;

import java.io.*;
import java.net.*;

public class EchoClient {

 private String ip;
 private int port;
 private String str;
 BufferedReader file;
 
//생성자
 public EchoClient(String ip, int port) throws IOException{
  
  this.ip = ip;
  this.port = port;
//Socket객체를 생성한다. Socket객체가 생성되면 서버와 TCP 커넥션이 이루어지게 된다. 동시에 서버의 accept()메서드는 클라이언트와 통신할 수 있는 Socket객체를 반환하게 된다. 따라서 클라이언트의 Socket객체와 서버의 Socket객체가 각각의 스트림을 이용하여 통신할 수 있게 된다.
  Socket tcpSocket = getSocket();   //사용자 메서드
  OutputStream os_socket = tcpSocket.getOutputStream();   //소켓에 쓰고
  InputStream is_socket = tcpSocket.getInputStream();   //소켓에서 읽는다
  
  BufferedWriter bufferW = new BufferedWriter(new OutputStreamWriter(os_socket));
  BufferedReader bufferR = new BufferedReader(new InputStreamReader(is_socket));
  System.out.print("입력 : ");
  
//소켓으로부터 읽는 것이 아니라 키보드로부터 읽는 또 하나의 BufferedReader
  file = new BufferedReader(new InputStreamReader(System.in));
  str = file.readLine();
  str += System.getProperty("line.separator");
  bufferW.write(str);
  bufferW.flush();
  str = bufferR.readLine();
  System.out.println("Echo Result : "+str);
  
  file.close();
  bufferW.close();
  bufferR.close();
  tcpSocket.close();
  
 }
 
 
 public Socket getSocket(){   //호스트의 주소와 포트를 사용, 소켓을 만들어 리턴하는 사용자 메서드
  
  Socket tcpSocket = null;
  
  try{
//원격 호스트(여기서는 서버)의 주소와 포트(여기서는 멤버변수)를 사용하여 Socket객체를 생성한다.
//호스트를 찾을 수 없거나, 서버의 포트가 열려 있지 않은 경우에는 UnknownHostException 이 발생하고,
//네트워크의 실패, 또는 방화벽 때문에 서버에 접근할 수 없을 때에는 IOException 이 발생할 수 있다.

   tcpSocket = new Socket(ip, port);
  }catch(IOException ioe){
   ioe.printStackTrace();
   System.exit(0);
  }
  return tcpSocket;
  
 }
 

 public static void main(String[] args)throws IOException{
    new EchoClient("localhost", 3000);
 }
 
}

출처 : http://u2m.kr/77

'Programming > JAVA,JSP' 카테고리의 다른 글

JAVA 프레임 안에 프레임  (1) 2012.11.18
JAVA 다중 계산 계산기  (0) 2012.11.17
Java 계산기 레이아웃  (0) 2012.11.17
setLookAndFeel 예제  (0) 2012.11.04
JAVA Look and Feel 활용 사이트  (0) 2012.11.04