普通接收函数的改进(时间片->线程实现)
最最开始,我的数据接收是用wxwi中的定时器定时读取来实现的,定时器中函数如下:
void SComtestFrame::OnTimer1Trigger(wxTimerEvent& event)
{
static DWORD number;
static DWORD i;
if((number=serialPort->read_t(receiveBuf))>0)
{
if(hexflag)
{
for(i=0;i<number;i++)
*TextCtrl1<<wxString::Format("%d",(unsigned char)receiveBuf[i])<<" ";
}
else
*TextCtrl1<<receiveBuf;
readed+=number;
StatusBar1->SetStatusText(wxString::Format("%i",readed),1);
delete[] receiveBuf;
}
}
read_t函数如下:
DWORD mySerialPort::read_t(char*& readbuf)
{
if(num=GetCacheByteNum())//是否有数据
{
if(num<0x100000)//大于1M?
{
readbuf=new char[num+5];//分配空间
readedBytes=Read(readbuf,num);
readbuf[readedBytes]=0;//添加结束符
return readedBytes;
}
else return -1;
}
return 0;
}
这种处理是每次读缓冲区所有数据并显示,但是接收高波特率,大量数据时会很容易没响应,也许把时间间隔设一点会好一些,但这样仍然阻塞了主线程,所以我决定还是将通信部分挪到单独线程去,主线程只负责图形界面显示与用户交互等。
我决定先去把图片显示出来再说。。。未完待续