读取2个无线电,串行通信之间发送的信号

时间:2011-07-19 13:40:19

标签: c++ mfc

我目前正通过电脑上的com端口从收听器上读取,读取其他2个收音机之间发送的信号。我遇到的问题是它如何正确地显示到列表框,因为它不是从顶部开始,它在输出上方放置了大量空行,迫使我向下滚动以查看它,并且我的循环表现得很奇怪。 这是代码:

void Cserial_NewDlg::OnBnClickedButton1()
{
    CString tempStr;
    bool bReading = true;
    //memset(&port, 0, sizeof(port));
    //memset(buffer,0,BUFFER_SIZE);
    while(bReading) {
        ReadFile(file,&buffer[0],BUFFER_SIZE,&bytesRead,NULL); //reading opened port
        if(bytesRead == 0)
            break;
        tempStr = buffer;
        int Pos = tempStr.Find("TX",0); //finding the start of each transmission
        if(Pos > 0){/*memcpy*/} 
        else {
            memmove(processBuffer,&buffer[Pos],PROCESS_SIZE); //copying buffer to a new buffer of correct size
            m_ListBox.AddString(processBuffer); //displaying
        }
        /*if(bytesRead == PROCESS_SIZE)
            bReading = false;*/
    }
}

第一次按下“读取”按钮时,它读取正常,但是我遇到了processBuffer的问题(29个字节,因为这是传输的长度)没有从前一个缓冲区重新复制数据(64字节,允许一些溢出)在第一次循环后,所以它强迫我再次按下读取按钮,这不是我想要的,我无法发现问题,任何想法?

2 个答案:

答案 0 :(得分:1)

您的商家信息中的Pos > 0分支是一个死分支,但这是一个问题,因为如果“TX”位于最开头,或者根本找不到,则只会执行其他操作。如果您读过缓冲区,并且没有出现“TX”,则会出现缓冲区读取错误,从缓冲区的索引-1开始。

基本上,假设您有一个不会返回整个邮件的简短阅读,或者说您只是有一个格式不正确的邮件,其中不包含您正在查找的“TX”密钥 - CString ::查找函数返回-1,表示“未找到”。在这种情况下,你必须继续阅读(也许在那里睡觉?),直到你在添加它之前找到你的消息结束。这样可以防止多次按下按钮。

我鼓励您详细说明您的预期信息 - 这将有助于我提供更具针对性的建议。

答案 1 :(得分:0)

最好为您的processBuffer使用std::deque<char>。顾名思义,该类是为双端队列设计的。您可以简单地附加buffer中的字节,并从头开始获取字节。