2013-01-16 53 views
0

我正在編寫一個代碼,使用comports從硬件設備接收心臟聲音並繪製接收到的信號。我使用OpenGl來繪製接收到的信號。我能夠在收到完整數據時進行繪圖。但我希望圖形與在這裏獲得的數據的更新更新是我的代碼:如何在MVS中使用OpenGL繪製實時2D圖形

int num_samples = 100000; 


long samples[100000]; 
DWORD  bytes_read = 0; // Number of bytes read from port 


/* Function plotting func */ 
void draw(float x1, float x2, float y1, float y2, int N) 
{ 
    float x, dx = 1.0/N; 
glPushMatrix(); /* GL_MODELVIEW is default */ 

glScalef(1.0/(x2 - x1), 1.0/(y2 - y1), 1.0); 
glTranslatef(-x1, -y1, 0.0); 
glColor3f(1.0, 1.0, 1.0); 

glBegin(GL_LINE_STRIP); 
int k =0; 
for(x = 0; x < num_samples; x += dx) 
{ 
    glVertex2f(x, samples[k]); 
    k=k+1; 
} 

glEnd(); 

glPopMatrix(); 

glFlush(); 
}; 

/* Redrawing func */ 
void redraw(void) 
{ 
    glClearColor(0, 0, 0, 0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    //long buf = getBuffer(samples); 
    draw(0, num_samples,-693554432, 693554432, 1); 
    // draw(func, 0, 1000,0, 5000, 1); 

    glutSwapBuffers(); 
    //glFlush(); 
}; 

/* Idle proc. Redisplays, if called. */ 
void idle(void) 
{ 
    glutPostRedisplay(); 
}; 

/* Key press processing */ 
void key(unsigned char c, int x, int y) 
{ 
    if(c == 27) exit(0); 
}; 

/* Window reashape */ 
void reshape(int w, int h) 
{ 
    glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, 1, 0, 1, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
}; 
/* 
long putBuffer(long[] buffer) 
{ 
    return buffer; 
}*/ 

//Main function 

int j =0; 
unsigned long size = 400000; 

int main(int argc, char* argv[]) 
{ 
    unsigned char INBUFFER[400000]; 

    char OUTBUFFER[20]; 
    DWORD  bytes_read = 0; // Number of bytes read from port 
    DWORD  bytes_written = 0; // Number of bytes written to the port 
    HANDLE  comport  = NULL; // Handle COM port 
int bStatus; 
    DCB   comSettings;   // Contains various port settings 
    COMMTIMEOUTS CommTimeouts; 
    strcpy(&OUTBUFFER[0], "The quick brown fox jumped over the lazy dog. \n\r\0"); 
    // Open COM port 
    if ((comport = 
     CreateFile("\\\\.\\COM44",    // open com5: 
        GENERIC_READ | GENERIC_WRITE, // for reading and writing 
        0,       // exclusive access 
        NULL,       // no security attributes 
        OPEN_EXISTING,    
        FILE_ATTRIBUTE_NORMAL, 
        NULL)) == INVALID_HANDLE_VALUE) 
    { 
     // cout<<"Port can't be opened"<<endl; 
    } 
    // Set timeouts in milliseconds 
// cout<<"Port opened"<<endl; 
    //DCB dcb; 
    CommTimeouts.ReadIntervalTimeout   = 0; 
    CommTimeouts.ReadTotalTimeoutMultiplier = 0; 
    CommTimeouts.ReadTotalTimeoutConstant = 100; 
    CommTimeouts.WriteTotalTimeoutMultiplier = 0; 
    CommTimeouts.WriteTotalTimeoutConstant = 100; 
    bStatus = SetCommTimeouts(comport,&CommTimeouts); 
    if (bStatus != 0) 
    { 
     // error processing code goes here 
    } 
    // Set Port parameters. 
    // Make a call to GetCommState() first in order to fill 
    // the comSettings structure with all the necessary values. 
    // Then change the ones you want and call SetCommState(). 
    GetCommState(comport, &comSettings); 
    // memset(&dcb,0,sizeof(dcb)); 

    comSettings.fBinary = 1; 
    comSettings.fDtrControl = DTR_CONTROL_ENABLE; 
    comSettings.fRtsControl = RTS_CONTROL_ENABLE; 
    comSettings.fOutxCtsFlow = 1; 
    comSettings.fRtsControl = DTR_CONTROL_HANDSHAKE; 


    comSettings.BaudRate = 921600; 
    comSettings.StopBits = ONESTOPBIT; 
    comSettings.ByteSize = 8; 
    comSettings.Parity = NOPARITY; 
    comSettings.fParity = FALSE; 

    bStatus = SetCommState(comport, &comSettings); 
    ofstream outdata; 
    outdata.open("hsm.txt"); // opens the file 
    if(!outdata) { // file couldn't be opened 
     cerr << "Error: file could not be opened" << endl; 
     exit(1); 
    } 
    if (bStatus == 0) 
    { 
     // error processing code goes here 
    } 
    int flag = 1; 
    int fl =1; 
    glutInit(&argc, argv); 
    glutInitWindowSize(500,500); 
    glutInitWindowPosition(500,200); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 


    //glutMainLoop(); 

    while(flag<120) 
    { 

     bStatus = ReadFile(comport, // Handle 
       &INBUFFER,   // Incoming data 
       size,     // Number of bytes to read 
       &bytes_read,   // Number of bytes read 
       NULL); 
     if (bStatus != 0) 
     { 
      //cout<<"Error receiving"<<endl; 
     } 
// long samples[100000]; 

for (int i=0; i<bytes_read; i++) 
{ 
    if((unsigned char)INBUFFER[i]==0x99&&(unsigned char)INBUFFER[i+4]==0x99) 

    { 
    samples[j] = 0x00|(unsigned char)INBUFFER[i+1]<<8|(unsigned char)INBUFFER[i+2]<<16|(unsigned char)INBUFFER[i+3]<<24; 
    if(samples[j]!=0) 
     { 
      outdata << samples[j] <<"\n"; 
      j++; 
     }  
    } 


} 

    flag++; 
    glutCreateWindow("Graph plotter"); 
    glutDisplayFunc(redraw); 
    glutReshapeFunc(reshape); 
    glutIdleFunc(idle); 
    glutMainLoop(); 

    } 
    CloseHandle(comport); 
outdata.close(); 


return 0; 
} 

基本上當樣本緩衝區被更新,圖形也應該更新。但是圖形在第一次迭代中繪製,然後沒有任何反應。 誰能告訴我如何解決它?

回答

1

當您調用glutMainLoop時,它將繪製屏幕,​​處理窗口事件並重復調用空閒功能。由於您現在所有的空閒功能都是要求重新繪製屏幕,​​所以它不會從您的輸入串行端口讀取更多樣本。

當你的idle函數被調用時,你應該嘗試讀取串行端口並填充額外的樣本。

+0

謝謝..其工作正常.. :) – Khushboo