Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Уточнение о том как работает оператор for https://www.cyberforum.ru/ cpp-beginners/ thread1508863.html
Я правильно понимаю? Оператор for, сперва будет работать только с первым выражением до тех пор, пока оно не станет ложным не переходя ко второму. После того как первое выражение станет ложным,...
C++ Контроль корректности ввода числа
В консоли в поле (Enter The Yar: )вводя нужно вводить только цифры, если ввести случайно букву то на экране консоли мерцает (Enter The Yar: ) бесконечно short int Yar_f() { Y: ...
C++ Способы обработки ошибочных ситуаций Добрый вечер!! Расскажите ваше мнение на тему обработки ошибок, как лучше реализовать? Заранее благодарю вас за ответы!! https://www.cyberforum.ru/ cpp-beginners/ thread1508836.html C++ Нажать на кнопку сайта В Visual c++ на MFC использую ActiveX WebBrowser,Открываю сайт через Navigate,нужно нажать на кнопку по id или по имени,сколько бы я не искал в основном нахожу код для Делфи или VB,вот что в MSDN... https://www.cyberforum.ru/ cpp-beginners/ thread1508790.html
Почему-то не выполняется оператор цикла C++
#pragma hdstop #include <stdio.h> #include <conio.h> int main() { int far; for(far=0; far<=300; far=far+20); printf("%d - %f\n",far,(5.0/9.0)*(far-32.0)); getch();
C++ Прилинковать SDL 2.0.3 к Visual Studio 2010 Express ребята делал все как написано тут версия сдл 2.0.3 но в конце выдает такое "sdltest.exe": Загружено: "C:\Users\Iliya\Documents\Visual Studio 2010\Projects\sdltest\Debug\sdltest.exe", Символы... https://www.cyberforum.ru/ cpp-beginners/ thread1508788.html
C++ Очень медленное выполнение .c_str() в minGW Есть функция: sscanf(line.c_str(), "%d\t%d\t%hu.%hu.%hu\t%hu:%hu:%hu\t%lf", &tmpData.Pip, &tmpData.Tm, &tmpData.Year, &tmpData.Mont, &tmpData.Day, &h, &tmpData.Min, &tmpData.Sec, &tmpData.Spd); ... https://www.cyberforum.ru/ cpp-beginners/ thread1508758.html Послать сообщение exe-шнику и получить ответ C++
Такая задача: есть exe-шник, скажем программа чат-бот. Запускается через командную строку и в командной строке же и работает. Пишешь фразу - тебе ответ. Задача воспользоваться этим экзешником в проге...
C++ Подсчет числа слов во введенных данных Приветствую. Имеется задание: напишите программу, которая должна вычислить, сколько раз каждое отдельное слово содержится во введенных данных. Мой код работает криво: считает неправильно, в некоторых... https://www.cyberforum.ru/ cpp-beginners/ thread1508730.html C++ Не работает программа, моделирующая работу стека https://www.cyberforum.ru/ cpp-beginners/ thread1508691.html
#include<iostream> using namespace std; const int MAX=10; ////////////////////////////// class stack { private: int st; int top; public:
Пропуск условия if внутри switch C++
В общем я как-то подвис, и не могу взять в толк в чем проблема.В свитче по сути if должен же работать. Помогите по возможности :) Собственно укороченная тест версия. #include "stdafx.h" ...
C++ Как компилятор узнаёт о размере массива при выполнении операции delete? https://www.cyberforum.ru/ cpp-beginners/ thread1508647.html
Такой глупый вопрос появился при изучении операций new и delete. Я создаю указатель на массив int с помощью операции new. int size; cin>>size; int* pointer; pointer = new int; Затем, после...
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
0

Синхронизация данных при чтении COM порта - C++ - Ответ 7937575

03.08.2015, 00:50. Показов 683. Ответов 0
Метки (Все метки)

Вынес отсюда
Как правильно организовать синхронизацию доступа к данным
У меня есть поток в котором я читаю данные из COM порта
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CCriticalSection CriticalSectionGPSPoint;
DWORD __stdcall ReadThread(LPVOID hwnd)
 {
 DWORD iSize;
 char sReceivedChar; //переменная для хранения поступающих символов
String str; //переменная для хранения образующихся из символов строк
while (true) //в бесконечном цикле
{
ReadFile(hCom, &sReceivedChar, 1, &iSize, 0); //считываем из порта поступающие символы
 
if ((int)sReceivedChar == 10) //когда встречается символ конца строки
{
Form1->Memo1->Lines->Add(str); //добавляем новую строку в компонент Memo
 if (str.Pos("RMC")) //смотрим, если в строке содержится последовательность «RMC»
{
CriticalSectionGPSPoint.Lock();
ParseRMC(str);
} //то это необходимая нам строка. Вызываем функцию для ее разбора
 if (str.Pos("GST")) //смотрим, если в строке содержится последовательность «RMC»
{
ParseRMC(str);
CriticalSectionGPSPoint.Unlock();
} //то это необходимая нам строка. Вызываем функцию для ее разбора
str = ""; //очищаем переменную для заполнения ее символами новой строки
}
else
 {
 str = str + sReceivedChar; //если строка еще не сформирована, то просто прибавляем 
//поступающие с порта символы
}
 }
 }
То есть мне приходит из порта набор сообщений в виде строк (+ сколько-то пустых строк), которые я парсю (сообщения RMC, GST обрабатываю, остальное выкидываю)

Однако в парсере я должен записать эти данные в какую-то переменную, которую смогу прочитать другим потоком
Для этого я использую критические секции (Начался набор сообщения, сделал лок, закончился набор сообщения, анлок)
А далее в другом потоке мне их надо как-то прочитать соответственно в нем я также вызываю
C++
1
2
3
CriticalSectionGPSPoint.Lock();
//Читаю данные которые записал в потоке чтения порта
CriticalSectionGPSPoint.Unlock();
И в сумме мне все это дает проблему, что при чтении из порта я получаю кривые сообщения
Вместо
$GPGST,085231.00,0.0000,,,,457720,457720,457720*69
получаю
$GPGST,085233.00,0.0000000000000000000000000000000 000000000000,,,,457726,457777777777777777777777777 77777777777777777777777777777777777777726,457726*6 D
То почему-то читаю некоторые символы по много раз
Хотя данная ошибка не стабильная и может появиться на неопределенное по счету сообщение.
Предполагаю, что в момент, когда я из второго потока делаю Lock() (для чтения данных) и первый поток вынужден ждать, что-то происходит, что в результате я получаю неверное сообщение из порта.
Помогите как правильно синхронизировать чтение из порта?

Вернуться к обсуждению:
Синхронизация данных при чтении COM порта C++
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2015, 00:50
Готовые ответы и решения:

Вылет в синий экран при чтении данных из ком-порта
Накидал читалку данных из ком-порта, вроде ничего особенного не делаю, а по истечение минуты...

Чтение из COM порта, При чтении из порта зависает read()
Каждому рано или поздно приходится программировать com порт. Вот и мой черед пришол. Я ужу умею:...

«Зависает» при чтении com порта
Здравствуйте! Алгоритм программы следующий: «Читать до конца файла» 1.1 Программный reset...

Подвисает при чтении COM порта
Доброго времени суток, сделал программу, которая читает данные из COM порта, строка кода которая...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2015, 00:50
Помогаю со студенческими работами здесь

Зависает при чтении com порта
Привет всем, подскажите, пожалуйста, у меня есть прибор, с которого я считываю данные каждую...

Зависает форма при чтении из порта
Пишу программку, которая читает данные из серийного порта. Но форма повисает, пока чтение не...

При чтении com порта зависает приложение
Вот эта строка кода вешает всё приложение: textBox1-&gt;Text = serialPort1-&gt;ReadLine(); Если её...

Зацикливание при чтении COM-порта в функции ReadFile()
Создал класс Transmit для работы с виртуальным COM-портом ПК. Transmit.h #include...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru