普通接收函数的改进(时间片->线程实现)

来源:互联网 发布:2000年流行网络歌曲 编辑:程序博客网 时间:2024/06/04 20:17

最最开始,我的数据接收是用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;    }

这种处理是每次读缓冲区所有数据并显示,但是接收高波特率,大量数据时会很容易没响应,也许把时间间隔设一点会好一些,但这样仍然阻塞了主线程,所以我决定还是将通信部分挪到单独线程去,主线程只负责图形界面显示与用户交互等。


我决定先去把图片显示出来再说。。。未完待续

0 0
原创粉丝点击