чтение сигналов, передаваемых между двумя радиостанциями, последовательными коммуникациями - PullRequest
2 голосов
/ 19 июля 2011

В настоящее время я читаю с ресивера через 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;*/
    }
}

При первом нажатии кнопки 'read' она хорошо читается, но у меня проблема с processBuffer (29 байт, так как это длина передачи) не повторное копирование данных из предыдущего буфера (64 байта, с учетом некоторого переполнения) после первого обхода цикла, поэтому я вынужден снова нажать кнопку чтения, это не то, что я намеревался, и я не могуНайдите проблему, есть идеи?

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Ветвь Pos > 0 в вашем списке - это мертвая ветвь, но это проблема, потому что ваш else выполняется только в том случае, если "TX" находится в самом начале или не найден вообще. Если вы когда-либо читаете свой буфер и «TX» не появляется, у вас есть ошибка чтения буфера, когда вы начинаете с индекса -1 буфера.

По сути, скажем, у вас есть краткое чтение, которое не возвращает целое сообщение, или просто у вас плохо отформатированное сообщение, которое не содержит искомого ключа TX - CString :: Функция поиска возвращает -1, что означает «не найден». В этих случаях вы должны продолжать читать (может, заснуть там?), Пока не найдете конец своего сообщения, прежде чем добавить его. Это предотвратит многократное нажатие кнопок.

Я бы посоветовал вам подробно рассказать о том, как выглядит ваше ожидаемое сообщение - это поможет мне дать более целенаправленный совет.

0 голосов
/ 19 июля 2011

Вам лучше использовать std::deque<char> для вашего ProcessBuffer.Как следует из названия, этот класс предназначен для двусторонней очереди.Вы можете просто добавить байты из buffer и взять байты с самого начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...