C++ 读取两台收音机之间发送的信号,串行通信

C++ 读取两台收音机之间发送的信号,串行通信,c++,mfc,C++,Mfc,我目前正在通过pc上的com端口从接收器读取数据,读取其他两台收音机之间发送的信号。我遇到的问题是它如何正确地显示在列表框中,因为它不是从顶部开始的,它在输出上方放置了大量的空行,迫使我向下滚动以查看它,而且我的循环行为异常。 代码如下: void Cserial_NewDlg::OnBnClickedButton1() { CString tempStr; bool bReading = true; //memset(&port, 0, sizeof(port)

我目前正在通过pc上的com端口从接收器读取数据,读取其他两台收音机之间发送的信号。我遇到的问题是它如何正确地显示在列表框中,因为它不是从顶部开始的,它在输出上方放置了大量的空行,迫使我向下滚动以查看它,而且我的循环行为异常。 代码如下:

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字节,允许一些溢出)重新复制数据,因此它迫使我再次按下读取按钮,这不是我想要的,我无法发现问题,有什么想法吗?

您最好使用
std::deque
作为您的processBuffer。顾名思义,该类是为双端队列设计的。您只需从
缓冲区
附加字节,并从开始处获取字节

列表中的
Pos>0
分支是一个死分支,但这是一个问题,因为您的else仅在“TX”在最开始时执行,或者根本找不到。若您读取了缓冲区,但“TX”并没有出现,则会出现缓冲区读取错误,从缓冲区的索引-1开始

基本上,假设您有一个不返回整个消息的短读,或者说您只是有一个格式不正确的消息,其中不包含您要查找的“TX”键-CString::Find函数返回-1,意思是“未找到”。在这种情况下,你必须继续阅读(可能在那里睡觉?),直到你在添加信息之前找到信息的结尾。这将防止多次按下按钮


我鼓励您详细说明您希望传达的信息,这将有助于我提供更有针对性的建议。

这篇文章的内容越来越冗长,因此我将其移至下面的答案。