Visual c++ 多行编辑框:为什么我遗漏了字符?

Visual c++ 多行编辑框:为什么我遗漏了字符?,visual-c++,mfc,Visual C++,Mfc,我正在编写一个程序,使用带有windows GUI的线程显示来自rs232的字符。收到的字符串将附加到线程中文本框的末尾。我发现接收是正确的,但显示器总是漏掉很多字符。 下面是接收并在编辑框上显示接收到的字符串的线程 UINT CTestserialDlg::SerialRecv(LPVOID pParam) { int *p=(int*)pParam; AsyncSerialPort *s=(AsyncSerialPort*)p[0]; CTestserialDlg *

我正在编写一个程序,使用带有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;
}
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];
整数计数=0;
而(1)
{
s->WaitForRecv();
睡眠(10);
int nbytes_recvd=s->recv_nowait(buf);
buf[nbytes_recvd]=0;
计数+=N字节\u记录;
跟踪(“字节记录:%d/%d\n”,n字节记录,计数);
//更新消息的GUI区域
//首先转换为十六进制字符串
如果(!nbytes\u recvd)//有可能得到零字节
持续
如果(pView->HexOut)
{
str[0]=0;
for(inti=0;im\u list\u text.AddString(str);
//pView->m_edit_text.SetWindowText(str);
int nlen=pView->m_edit_text.GetWindowTextLength();
pView->m_edit_text.setel(nlen,nlen);
pView->m_edit_text.ReplaceSel(str);
}
其他的
{
//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.setel(nlen,nlen);
pView->m_edit_text.ReplaceSel(buf);
//pView->m_edit_text.LineScroll(行);
//pView->m_edit_text.SetWindowText(buf);
跟踪(“%s”,buf);
}
}
返回0;
}
我发送了一个包含878个字符的cpp文件和程序结果:

调试跟踪输出: *

#包括“asyncserialport.h”
#包括
int main(int argc,字符**argv)
{
如果(argc!=3&&argc!=4)
{
printf(“用法:%s端口txtfile波特率(默认值=9600)”,argv[0]);
出口(0);
}
int-portnum=atoi(argv[1]);
整数波特=9600;
如果(argc==4)
波特=atoi(argv[3]);
异步串行端口;
如果(!s.init(端口号,波特率,8,0,0,010241024))
{
printf(“串行端口%d打开错误”,portnum);
出口(-1);
}
字符行[256];
文件*fp=fopen(argv[2],“r”);
整数计数=0;
而(!feof(fp))
{
fgets(第256行,fp);
//追加\r\n它只有新行,但没有回车符
int len=strlen(直线);
如果(第[len-1]行='\n')
{
第[len-1]行=0x0d;
行[len]=0x0a;
行[len+1]=0;
}
printf(“%s”,第行);
s、 发送等待(行,strlen(行),1000);
计数+=strlen(行);
}
fclose(fp);
printf(“\n已传输%d字节,\n”,计数);
s、 close();
}
字节记录: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
#包括“asyncserialport.h”
#包括
int main(int argc,字符**argv)
{
如果(argc!=3&&argc!=4)
{
printf(“用法:%s端口txtfile波特率(默认值=9600)”,argv[0]);
出口(0);
}
int-portnum=atoi(argv[1]);
整数波特=9600;
如果(argc==4)
波特=atoi(argv[3]);
AsyncSeria
缺少很多字符。recv实际上循环了4次,第3次字符串没有显示,并且在编辑框中完全丢失。 我想知道三个函数GetWindowTextLength、SetSel和ReplaceSel在运行过快时是否正常工作?(波特率为115200,发送/接收文件速度非常快)
任何人都可以给我一些提示吗?谢谢

我想我已经得到了答案。这不是因为代码,而是因为editbox。我用HScroll和AutoHscroll修改了editbox属性,现在一切都正常了

#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