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次,並且第三次的字符串沒有被顯示並且在編輯框中完全丟失。 我想知道如果三個函數GetWindowTextLength,SetSel,ReplaceSel在運行速度太快時能夠正常工作嗎? (在115200波特率和發送/ recv文件是非常快的) 任何人都可以給我一些提示呢?謝謝