我目前正通过电脑上的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字节,允许一些溢出)在第一次循环后,所以它强迫我再次按下读取按钮,这不是我想要的,我无法发现问题,任何想法?
答案 0 :(得分:1)
您的商家信息中的Pos > 0
分支是一个死分支,但这是一个问题,因为如果“TX”位于最开头,或者根本找不到,则只会执行其他操作。如果您读过缓冲区,并且没有出现“TX”,则会出现缓冲区读取错误,从缓冲区的索引-1开始。
基本上,假设您有一个不会返回整个邮件的简短阅读,或者说您只是有一个格式不正确的邮件,其中不包含您正在查找的“TX”密钥 - CString ::查找函数返回-1,表示“未找到”。在这种情况下,你必须继续阅读(也许在那里睡觉?),直到你在添加它之前找到你的消息结束。这样可以防止多次按下按钮。
我鼓励您详细说明您的预期信息 - 这将有助于我提供更具针对性的建议。
答案 1 :(得分:0)
最好为您的processBuffer使用std::deque<char>
。顾名思义,该类是为双端队列设计的。您可以简单地附加buffer
中的字节,并从头开始获取字节。