我正在编写一个程序来使用带有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次字符串没有显示并且在编辑框中完全丢失。 我想知道当它运行得太快时,三个函数GetWindowTextLength,SetSel,ReplaceSel是否正常工作? (波特率为115200,发送/恢复文件非常快) 有人可以给我一些提示吗?感谢
答案 0 :(得分:0)
我想我已经得到了答案。这不是由于代码,而是由于编辑框。我已经使用HScroll和AutoHscroll修改了editbox属性,现在一切正常。