================================ Outline ====================================
Packet 전달 함수 만들기
- AX-12+ Baud Rate 값 변경
- Packet 전달 함수
----------------------------------------------------------------------------
/*
모터가 300도와 0도 사이를 오가며 지속적으로 회전시키려면 모터 회전 후 딜레이 값을 0.865초를 주면 된다.
_delay_ms(865);
*/
AX-12+ Baud Rate 값 변경
Baud Rate를 변경해 주기 위해서는 instruction에 WRITE_DATA(#3), Length 값에 4, Write Address 값은 4이다.


바꿔주고자하는 Baud Rate는 9,600bps로 한다.

207은 Hex값으로 0xCF이다.

AX-12+와 통신을 위해 AX-12+의 Baud Rate를 바꿔주고 난 후 ATmega2560의 Baud Rate도 변경해 주어야 한다.
103의 hexa값은 0x67이다.

그리하여 코드는 아래와 같다.
#include <avr/io.h> #include <util/delay.h>
void USART0_init() { /* BAUD Rate Set */ UBRR0 = 0;
/* USART Set */ UCSR0A = 0b00000000; //일반모드 UCSR0B = 0b00001000; //인터럽트 사용 안함 UCSR0C = 0b00000110; }
void PacketTX_P1(unsigned char ID, unsigned char Length, unsigned char Instruction, unsigned char cmd, unsigned char para1) { Data_Tx0(0xFF); //ini Data_Tx0(0xFF); //ini Data_Tx0(ID); //ID Data_Tx0(Length); //LENGTH = 2+ # of parameter Data_Tx0(Instruction); //Instruction Data_Tx0(cmd); //command in control table Data_Tx0(para1); //goal position(rear byte) Data_Tx0((unsigned char)(~(ID + Length + Instruction + cmd + para1))); _delay_ms(865); }
int main(void)
{
_delay_ms(1000); USART0_init(); //AX-12+ Baud Rate 9600으로 변경 PacketTX_P1(0x0C, 0x04, 0x03, 0x04, 0xCF); _delay_ms(3000);
//ATmega250 Baud Rate 9600으로 변경 UBRR0 = 0x67;
return 0;
}
|
Packet 전달 함수
주의할 점은 check sum의 값이다. parameter의 개수의 따라 인자의 갯수와 check sum 인자의 개수가 바뀜으로 주의해야 한다.
void PacketTX_P1(unsigned char ID, unsigned char Length, unsigned char Instruction, unsigned char cmd, unsigned char para1) { Data_Tx0(0xFF); //ini Data_Tx0(0xFF); //ini Data_Tx0(ID); //ID Data_Tx0(Length); //LENGTH = 2+ # of parameter Data_Tx0(Instruction); //Instruction Data_Tx0(cmd); //command in control table Data_Tx0(para1); //para 1 Data_Tx0((unsigned char)(~(ID + Length + Instruction + cmd + para1))); _delay_ms(865); } void PacketTX_P2(unsigned char ID, unsigned char Length, unsigned char Instruction, unsigned char cmd, unsigned char para1, unsigned char para2) { Data_Tx0(0xFF); //ini Data_Tx0(0xFF); //ini Data_Tx0(ID); //ID Data_Tx0(Length); //LENGTH = 2+ # of parameter Data_Tx0(Instruction); //Instruction Data_Tx0(cmd); //command in control table Data_Tx0(para1); //para 1(rear byte) Data_Tx0(para2); //para 2(head byte) Data_Tx0((unsigned char)(~(ID + Length + Instruction + cmd + para1 + para2))); _delay_ms(865); }
|
================================ Outline ====================================
Server socket 프로그램
- PORT 번호
- 컴파일을 위한 makefile
/*** 소스 ***/
----------------------------------------------------------------------------
PORT 번호
예약된 PORT 번호는 1 - 1,024이며 system에서 사용한다.
//가장 흔히 사용하는 web의 PORT #는 80이다.


일반적으로는 995까지는 시스템에서 사용한다. bind함수를 사용하여 socket정보를 엮을 때 1024내에 번호를 설정하면 오류가 난다.
//사용 가능한 PORT 번호는 0 - 65,535(unsigned 2 byte)까지이다.
컴파일을 위한 makefile
make 명령어를 사용하여 컴파일이 가능하도록 만들어 보자.
vi편집기 기본 세팅문서로 들어간다.
# vi /home/newind2000/.vimrc
vi편집기의 기본세팅에 스페이스가 입력되는 설정을 주석처리 해주자. 주석처리는 “ 로 해준다.

vi makefile을 입력하여 makefile을 만든다.
아래와 같이 편집한다.
//골뱅이(@)가 없으면 명령어인 echo test가 같이 출력 됨으로 골뱅이 표시를 넣어준다.

make를 치면 아래와 같이 출력된다.


이것을 적용하여,
server : server.c smartsock.h
gcc -lm -o server server.c
다음과 같이 명령어를 넣어주면 ‘make'만 쳐도 컴파일이 된다.
! 명령어(위에서는 gcc)에서는 이전에는 TAB키를 사용하여 띄워주어야 함을 명심하자.

// 위에 놈은 혼자 심심해서 한거여유. 밑에 소스 내용 참고 하시씨요. *'-'*
/*** 소스 ***/
<server.c>
#include "smartsock.h"
int main(void) { int iSock; //소켓 함수의 반환 값을 받는 변수 int iRet; struct sockaddr_in stAddr;
iSock = socket(AF_INET, SOCK_STREAM, 0); //AF_INET = 2, if(0 > iSock) { perror("socket : "); return -1; } // stAddr구조체에 socket연결을 위한 필수 정보 입력 setting bzero(&stAddr, sizeof(stAddr)); //구조체 비우기(0으로 채우기) stAddr.sin_family = AF_INET; //#define AF_INET 2 /* IP protocol family. */ stAddr.sin_addr.s_addr = inet_addr(IP); //IP와 PORT값은 헤더파일에 정의되어 있다. stAddr.sin_port = htons((PORT));
iRet = bind(iSock, (struct sockaddr *)&stAddr,sizeof(stAddr)); if(iRet < 0) { perror("bind : "); close(iSock);
return -2; }
close(iSock); return 0; }
|
<smartsock.h>
#ifndef __SMARTSOCK_H__ #define __SMARTSOCK_H__ #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <sys/stat.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h>
#endif // __SMARTSOCK_H__ |
<makefile>
CC = gcc
CTRG = client
STRG = server
SSRC = server.c
CSRC = client.c
CFLAGS = --save-temps
all: server client
rebuild: clean all
server: @$(CC) $(CFLAGS) -o $(STRG) $(SSRC)
client: @$(CC) $(CFLAGS) -o $(CTRG) $(CSRC)
clean: @rm -rf $(STRG) $(STRG).o $(STRG).i $(STRG).s @rm -rf $(CTRG) $(CTRG).o $(CTRG).i $(CTRG).s
|