2014-01-17 9 views
0

我正在編寫一個程序,使用帶有Windows GUI的線程顯示rs232中的字符。收到的字符串被追加到線程中文本框的末尾。我發現接收是正確的,但顯示器總是會丟失相當多的字符。 下面是接收並顯示編輯框中收到的字符串的線程。多行編輯框:爲什麼我錯過了字符?

UINT CTestserialDlg::SerialRecv(LPVOID pParam) 
{ 
    int *p=(int*)pParam; 
    AsyncSerialPort *s=(AsyncSerialPort*)p[0]; 
    CTestserialDlg *pView=(CTestserialDlg*)p[1]; 
    char buf[1024]; 
    char str[1024]; 
    int count=0; 
    while(1) 
    { 
     s->WaitForRecv(); 
     Sleep(10); 
     int nbytes_recvd=s->recv_nowait(buf); 
     buf[nbytes_recvd]=0; 
     count+=nbytes_recvd; 

     TRACE("Bytes recvd: %d/%d\n",nbytes_recvd,count); 
     //update the GUI area for the message 
     //first convert to hex string 
     if(!nbytes_recvd) //there is a chance that get zero bytes 
      continue; 
     if(pView->HexOut) 
     { 
      str[0]=0; 
      for(int i=0;i<nbytes_recvd;i++) 
       sprintf(str+i*3,"%02x ",buf[i]&0xff); 
      str[i*3]=0x0d; 
      str[i*3+1]=0x0a; 
      str[i*3+2]=0; 
      //pView->m_list_text.AddString(str); 
      //pView->m_edit_text.SetWindowText(str); 
      int nlen=pView->m_edit_text.GetWindowTextLength(); 
      pView->m_edit_text.SetSel(nlen,nlen); 
      pView->m_edit_text.ReplaceSel(str); 

     } 
     else 
     { 
      //strcpy(buf, "aaa\r\nbbb"); 
      //pView->m_list_text.AddString(buf); 
      //int line=pView->m_edit_text.GetLineCount(); 
      int nlen=pView->m_edit_text.GetWindowTextLength(); 
      pView->m_edit_text.SetSel(nlen,nlen); 
      pView->m_edit_text.ReplaceSel(buf); 
      //pView->m_edit_text.LineScroll(line); 
      //pView->m_edit_text.SetWindowText(buf); 
      TRACE("%s",buf); 
     } 
    } 
    return 0; 
} 

我發送一個CPP文件有878個字符,程序結果:

調試跟蹤輸出: *

#include "asyncserialport.h" 
#include <stdio.h> 
int main(int argc,char **argv) 
{ 
    if(argc!=3 && argc!=4) 
    { 
     printf("Usage: %s port txtfile baudrate(default=9600)",argv[0]); 
     exit(0); 
    } 
    int portnum=atoi(argv[1]); 
    int baud=9600; 
    if(argc==4) 
     baud=atoi(argv[3]); 
    AsyncSerialPort s; 
    if(!s.init(portnum,baud,8,0,0,0,1024,1024)) 
    { 
     printf("serial port %d open error\n",portnum); 
     exit(-1); 
    } 
    char line[256]; 
    FILE* fp=fopen(argv[2],"r"); 
    int count=0; 
    while(!feof(fp)) 
    { 
     fgets(line,256,fp); 
     //append \r\n it only has new line but no carriage return 
     int len=strlen(line); 
     if(line[len-1]=='\n') 
     { 
      line[len-1]=0x0d; 
      line[len]=0x0a; 
      line[len+1]=0; 
     } 
     printf("%s",line); 
     s.send_wait(line,strlen(line),1000); 
     count+=strlen(line); 
    } 
    fclose(fp); 
    printf("\n%d bytes transmitted\n",count); 
    s.close(); 
} 

字節recvd:0/878

編輯文本框顯示爲:

#include "asyncserialport.h" 
#include <stdio.h> 

    int main(int argc,char **argv) 
    { 
     if(argc!=3 && argc!=4) 
     { 
      printf("Usage: %s port txtfile baudrate(default=9600)",argv[0]); 
      exit(0); 
     } 
     int portnum=atoi(argv[1]); 
     int baud=9600; 
     if(argc==4) 
      baud=atoi(argv[3]); 
     AsyncSeria 

很多字符都丟失了。 recv實際上是循環了4次,並且第三次的字符串沒有被顯示並且在編輯框中完全丟失。 我想知道如果三個函數Ge​​tWindowTextLength,SetSel,ReplaceSel在運行速度太快時能夠正常工作嗎? (在115200波特率和發送/ recv文件是非常快的) 任何人都可以給我一些提示呢?謝謝

回答

0

我想我已經得到了答案。這不是由於代碼,而是由於編輯框。我已經用HScroll和AutoHscroll修改了editbox屬性,現在一切似乎都正常了。