12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
1

Синхронизация данных при чтении COM порта

03.08.2015, 00:50. Показов 496. Ответов 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.00000000000000000000000000000000000000000 00,,,,457726,45777777777777777777777777777777777777777777777 777777777777777777726,457726*6D
То почему-то читаю некоторые символы по много раз
Хотя данная ошибка не стабильная и может появиться на неопределенное по счету сообщение.
Предполагаю, что в момент, когда я из второго потока делаю Lock() (для чтения данных) и первый поток вынужден ждать, что-то происходит, что в результате я получаю неверное сообщение из порта.
Помогите как правильно синхронизировать чтение из порта?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
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->Text = serialPort1->ReadLine(); Если её...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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