<<前へ
次へ>>
三点倒立
三点倒立パソコン側プログラム(マイコン側プログラムはfour_cr.c)
/*
Windows版シリアル送信(m_check.c)
三点倒立
2003/09/()
*/
four_cr.c
#include <windows.h>
#include <stdio.h>
#include <ctype.h>
#define MOTOR_NUM 12
#define MOTION_NUM 14
unsigned char rc[MOTOR_NUM][15]=
{{ 90, 90, 90, 90, 90, 90,100,100,100,100,100,100,100,100,100},
{150,150, 90, 90, 90, 90,150,150,150,150,150,150,150,150,100},
{100,100,100,100,100,100,120,120,120,120,120,120,120,120,120},
{179,179,179, 90, 0, 0, 0, 0, 0, 0, 0, 90,179,179, 90},
{150,179,179,179,179,179,179,150,150,150,170,170, 80, 70,150},
{100,100,100,100,100, 0, 0, 0,100,100,100,100,100,100,100},
{ 90, 90, 90, 90, 90, 90, 80, 80, 80, 80, 80, 80, 80, 80, 80},
{ 30, 30, 90, 90, 90, 90, 30, 30, 30, 30, 30, 30, 30, 30, 80},
{ 80, 80, 80, 80, 80, 80, 50, 50, 50, 50, 50, 50, 50, 50, 50},
{ 0, 0, 0, 90,179,179,179,179,179,179,179, 90, 0, 0, 90},
{ 30, 0, 0, 0, 0, 0, 0, 30, 30, 30, 10, 10,100,110, 30},
{ 80, 80, 80, 80, 80,179,179,179, 80, 80, 80, 80, 80, 80, 80}};
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */
unsigned char inter[15]={15,25, 25, 25, 25, 5, 5, 5, 10, 15, 15, 15, 100, 10, 30};
typedef enum { // ボーレート設定リスト
br2400 = 2400,
br4800 = 4800,
br9600 = 9600,
br19200 = 19200,
br31250 = 31250,
br38400 = 38400,
br57600 = 57600
} BaudRate;
/* シリアルポート初期化関数 */
void InitSer(DCB dcb, HANDLE* hComm, BaudRate baud)
{
*hComm = CreateFile(
"COM1", /* シリアルポートの指定 */
GENERIC_WRITE, /* アクセスモード */
0, /* 共有モード */
NULL, /* セキュリティ属性 */
OPEN_EXISTING, /* 作成フラグ */
FILE_ATTRIBUTE_NORMAL, /* 属性 */
NULL /* テンプレートのハンドル */
);
GetCommState(*hComm, &dcb); /* DCB を取得 */
dcb.BaudRate = baud;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
SetCommState(*hComm, &dcb); /* DCB を設定 */
}
int chop(char* input)
{
int i, c_stat, r_stat=1;
for(i=0; input[i]!='\n'; i++){
c_stat=isdigit(input[i]);
if(c_stat==0){
r_stat=-1;
}
}
input[i]='\0';
return(r_stat);
}
int checkn(int maxn)
{
char input[1024]; /* 入力用 */
int status, status2, value=-1; /* エラー処理,数値格納 */
while(1){
printf("\n送信数値を入力(0-%d)%dで終了:", maxn,maxn+1);
fgets(input, 1024, stdin);
status=sscanf(input, "%d", &value);
status2=chop(input);
if(status!=1 || status2<0){
printf("数値以外が入力されました\n");
printf("入力文字%s\n", input);
}else if(value>=0 && value <=maxn+1){
if(value==maxn+1){
return(-1);
}
return(value);
}else if(status==1){
printf("0-%dの範囲外の数値が入力されました\n",maxn);
printf("入力数値%d\n", value);
}
value=-1;
}
}
int main(void)
{
DCB dcb; /* 通信パラメータ */
HANDLE hComm; /* シリアルポートのハンドル */
DWORD writesize; /* ポートへ書き込んだバイト数 */
BaudRate baud=br38400; /* BaudRate設定用 */
unsigned char sendd1,sendd2; /* 数値格納 */
int echeck1,echeck2;
InitSer(dcb, &hComm, baud);
sendd1=252;
WriteFile(hComm, &sendd1, 1, &writesize, NULL); /* シリアルポートに書き込み */
sendd1=MOTION_NUM;
WriteFile(hComm, &sendd1, 1, &writesize, NULL); /* シリアルポートに書き込み */
sendd1=1;
WriteFile(hComm, &sendd1, 1, &writesize, NULL); /* シリアルポートに書き込み */
for(echeck1=0; echeck1<MOTOR_NUM; echeck1++){
for(echeck2=0; echeck2<MOTION_NUM; echeck2++){
WriteFile(hComm, &rc[echeck1][echeck2], 1, &writesize, NULL); /* シリアルポートに書き込み */
}
}
sendd1=247;
WriteFile(hComm, &sendd1, 1, &writesize, NULL);
for(echeck1=0; echeck1<MOTION_NUM; echeck1++){
WriteFile(hComm, &inter[echeck1], 1, &writesize, NULL);
}
sendd1=254;
WriteFile(hComm, &sendd1, 1, &writesize, NULL); /* シリアルポートに書き込み */
while(1){
echeck1=checkn(253);
sendd1=echeck1;
if(echeck1<0){
break;
}
WriteFile(hComm, &sendd1, 1, &writesize, NULL); /* シリアルポートに書き込み */
}
CloseHandle(hComm);
return(0);
}
三点倒立