串口通信的上位机程序(openGL画图)

//*******************************************************************************************
/*          上位机程序
本程序实现两个功能:
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(

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值