多行编辑框:为什么我错过了角色?

时间:2014-01-17 02:13:31

标签: visual-c++ mfc

我正在编写一个程序来使用带有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;
}

我发送一个包含878个字符的cpp文件,程序结果为:

调试TRACE输出: *

#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();
}

Bytes 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次,并且第3次字符串没有显示并且在编辑框中完全丢失。 我想知道当它运行得太快时,三个函数Ge​​tWindowTextLength,SetSel,ReplaceSel是否正常工作? (波特率为115200,发送/恢复文件非常快) 有人可以给我一些提示吗?感谢

1 个答案:

答案 0 :(得分:0)

我想我已经得到了答案。这不是由于代码,而是由于编辑框。我已经使用HScroll和AutoHscroll修改了editbox属性,现在一切正常。