最最開始,我的數據接收是用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;
}
}
這其中附帶將數據顯示在wxtextctrl中的處理,那個hexflag實際上是十進制顯示。。。我當時找了一頓竟然發現不能簡單的將char*指向的存儲區的數值直接顯示出來,所以用了這麼個笨辦法。
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;
}
這種處理是每次讀緩衝區所有數據並顯示,但是接收高波特率,大量數據時會很容易沒響應,也許把時間間隔設一點會好一些,但這樣仍然阻塞了主線程,所以我決定還是將通信部分挪到單獨線程去,主線程只負責圖形界面顯示與用戶交互等。
我決定先去把圖片顯示出來再說。。。未完待續