//*******************************************************************************************
/* 上位机程序
本程序实现两个功能:
1.从串口接收数据,并将字符串转化成整型数据。
2.利用整型数据,转化成角度,对虚拟模型进行旋转
*/
//*******************************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#include <math.h>
#include <gl/glut.h>
#include <windows.h>
HANDLE hComm;
OVERLAPPED m_ov;
COMSTAT comstat;
DWORD m_dwCommEvents;
#define WIDTH 400
#define HEIGHT 400
#define ColoredVertex(c, v) do{ glColor3fv(c); glVertex3fv(v); }while(0)
#define MAX_CHAR 128
GLfloat angle = 0.0f,anglex = 0.0f;//旋转动画角度初始值
static int Dxx=0,Dyy=0,Dzz=0;//旋转方向
int xx,yy,zz;//从串口得到的坐标变化
//对应关系:zz+1->Dyy-1 xx+1->Dxx-1 yy+1->Dzz-1
int tempb=0;//zz用于保存上次的读取结果
int tempab=0;//计算zz偏移角的变量
int tempx=0;//xx用于保存上次的读取结果
int tempax=0;//计算xx偏移角的变量
int limitx,limity,limitz;//旋转的最大角度
char input[40]="c=+000";
char tempd[2]=" ";//暂存RXBuff
int tt=0;//字符串序号移位
int inputflag=0;//接收字符类型判断,1=a,2=b,3=c
/*******************串口部分***************************/
bool openport(char *portname)//打开一个串口
{
hComm = CreateFile(portname,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
if (hComm == INVALID_HANDLE_VALUE)
return FALSE;
else
return true;
}
bool setupdcb(int rate_arg)
{
DCB dcb;
int rate= rate_arg;
memset(&dcb,0,sizeof(dcb));
if(!GetCommState(hComm,&dcb))//获取当前DCB配置
{
return FALSE;
}
/* -------------------------------------------------------------------- */
// set DCB to configure the serial port
dcb.DCBlength = sizeof(dcb);
/* ---------- Serial Port Config ------- */
dcb.BaudRate = rate;
dcb.Parity = NOPARITY;
dcb.fParity = 0;
dcb.StopBits = ONESTOPBIT;
dcb.ByteSize = 8;
dcb.fOutxCtsFlow = 0;
dcb.fOutxDsrFlow = 0;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = 0;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fOutX = 0;
dcb.fInX = 0;
/* ----------------- misc parameters ----- */
dcb.fErrorChar = 0;
dcb.fBinary = 1;
dcb.fNull = 0;
dcb.fAbortOnError = 0;
dcb.wReserved = 0;
dcb.XonLim = 2;
dcb.XoffLim = 4;
dcb.XonChar = 0x13;
dcb.XoffChar = 0x19;
dcb.EvtChar = 0;
/* -------------------------------------------------------------------- */
// set DCB
if(!SetCommState(hComm,&dcb))
{
return false;
}
else
return true;
}
bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,DWORD ReadTotalconstant,DWORD WriteTotalMultiplier,DWORD WriteTotalconstant)
{
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout=ReadInterval;
timeouts.ReadTotalTimeoutConstant=ReadTotalconstant;
timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier;
timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;
timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier;
if(!SetCommTimeouts(hComm, &timeouts))
{
return false;
}
else
return true;
}
/***************************寻找有效数值zz ***************************/
int findnum(char stringi[],int toz)
{
int ii;
char tempz[4];//,tempy[4],tempz[4];
for(ii=0;ii<strlen(stringi);ii++)
{
if((stringi[ii]=='c')&&((stringi[ii+1]=='-')||(stringi[ii+1]=='+'))&&((stringi[ii+2]=='0')||(stringi[ii+2]=='1')||(stringi[ii+2]=='2')||(stringi[ii+2]=='3')||(stringi[ii+2]=='4')||(stringi[ii+2]=='5')||(stringi[ii+2]=='6')||(stringi[ii+2]=='7')||(stringi[ii+2]=='8')||(stringi[ii+2]=='9')))
{
//读数
tempz[0]=stringi[ii+1];//读符号位
tempz[1]=stringi[ii+2];//读符百位
tempz[2]=stringi[ii+3];//读符十位
tempz[3]=stringi[ii+4];//读符个位
//转换为整型
toz=(int)(tempz[1]-'0')*100+(int)(tempz[2]-'0')*10+(int)(tempz[3]-'0');
if(tempz[0]=='-')toz=-toz;
else if(tempz[0]=='+')toz=toz;
break;
}
}
return toz;
}
/***************************寻找有效数值xx ***************************/
int findnum_x(