реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Работа с ком портом в Eclipce CDT
Twen
сообщение Feb 17 2012, 11:42
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Я уже немного понял о многопоточности, скачал пример и переделал.
У приложении я использую 3 потока(у примере было 2: чтение и запись).
Первый - чтение;
Второй - запись;
Третий - это выполнение моей программы.

Сначала запускается поток на чтение, второй и третий потоки находятся в ожидании.
По нажатии на кнопку я делаю ResumeThread(task);

У функции я делаю запись, чтение, то есть вызываются другие потоки (происходит передача данных по xmodem) после этого вызываю suspend.

Вроде заработало вроде...

Сообщение отредактировал Twen - Feb 17 2012, 13:15
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 17 2012, 13:24
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Вроде заработало вроде...

Пока не видно где у вас что то работает одновременно. Похоже, что все потоки у вас выполняются строго последовательно. Если это так, то потоки вам вообще не нужны.

Еще раз спрашиваю - что должна делать программа?
Go to the top of the page
 
+Quote Post
Hmm
сообщение Feb 17 2012, 15:47
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 329
Регистрация: 22-06-04
Пользователь №: 124



Цитата
А если не полениться и как следует освоить этот инструмент, то он оказывается на удивление гибким и удобным.
Нет уж. Все, что мне нужно я готовлю сам.


--------------------
Талант не пропить ...
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 17 2012, 23:38
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Мне нужно реализовать протокол x-modem. Я взял модуль работы с х-модемом и добавил две функции запись и чтение, но как я писал они у меня не совсем корректно работали...я писал высшее можете ли вы подсказать как правильно считывать с порта...У протоколе нужно отправлять данные и смотреть на входные(читать и писать в порт)...

Виснет устройство, наверное неправильно делаю чтение или запись :
Sleep(100);
ClearCommError(handle, &temp, &ComState);
ReadFile(handle, buf_in, in_numbytes, &numbytes_ok, &Overlap);

Блин уже вожусь...не знаю даже...

Сообщение отредактировал Twen - Feb 18 2012, 01:43
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 18 2012, 08:43
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Мне нужно реализовать протокол x-modem.
Если вам нужен только xmodem, то никакие потоки, OVERLAPPED чтения и пр. вам не нужны. Вам нужен банальный блокирующий ReadFile и WriteFIle и больше ничего
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 18 2012, 10:46
Сообщение #21


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Я понимаю все должно быть банально, я опять вернулся к варианту программы без потоков. Смотрите объясню свою проблему детальнее.
Отправка в порт происходит нормально а вот прием...иногда принимает , иногда нет , когда я исползую REadFile,
вот смотрите:

Вот две функции чтения и записи, которые нужно реализовать:

функция вывода работает вроде нормально...
void outbyte(uint8_t value)
{
uint32_t i = 0;
DWORD temp;
buf_out[0] = value;
out_numbytes = 1;


ClearCommError(handle, &temp, &ComState);
if(!temp) {
WriteFile(handle, buf_out, out_numbytes, &numbytes_ok, &Overlap);
}

do {
if(i++ > 40) {
break;
}
ClearCommError(handle, &temp, &ComState);
for (unsigned int i = 0; i < 40; i++);
} while (ComState.cbOutQue > 0);

}


а вот функция приема иногда не принимает, хотя снифером я смотрю что данные поступают...
uint8_t inbyte(uint8_t timeout)
{
DWORD temp;
uint32_t i = 0;
uint16_t in_ok;

in_numbytes = 1; //количество ожидаемых принятых данных


do {
if(i++ > 50) {
break; //вот здесь вылетает
}
ClearCommError(handle, &temp, &ComState);//получаю состоянии порта
for (unsigned int i = 0; i < 40; i++); //задержка
} while (ComState.cbInQue != in_numbytes);

if((i < 50) & (!temp)) {
ReadFile(handle, buf_in, in_numbytes, &numbytes_ok, &Overlap);
}
}


Как корректно пользоваться функциями ReadFile, WriteFile, ClearCommError чтобы порт не выс и корректно принимал байты.
.
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 18 2012, 13:05
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Уберите флаг OVERLAPPED при открытии порта. Уберите параметр &Overlap (подайте NULL) при вызове ReadFile и WriteFile.
После этого вызовы ReadFile и WriteFile будут блокироваться пока не примут/отправят заданное количество байтов, либо пока не случится таймаут, заданный при настройке открытого порта

И лучше принимать/передавать не по 1 байту за раз, а сразу несколько
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 19 2012, 11:07
Сообщение #23


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Тогда получается ненужно никаких циклов ожидания...а тогда функцию ClearCommError() обязательно вызывать перед чтением или записью?
Буду пробовать, спасибо.
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 19 2012, 13:42
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Twen @ Feb 19 2012, 15:07) *
Тогда получается ненужно никаких циклов ожидания...
Точно
Цитата
а тогда функцию ClearCommError() обязательно вызывать перед чтением или записью?
Нет, Ее надо звать после того, как функции Read/WriteFile вернутся с ошибкой, что бы можно было еще раз попробовать передать/принять данные из COM порта.
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 19 2012, 17:10
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



XVR Спасибо большое за советы!
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 28 2012, 14:59
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Все вроде бы работает, но заметил один момент...
Когда я включаю компьютер и запускаю свою программу для работы с COM-портом, то при выводе выводятся нули...снифером смотрю, ком открыт и передаются не нули, но на плату, которая подключена к ПК приходят нули, снифер показывается нормальные данные. Но когда я открываю ком-порт программкой для работы с СОМ "Hercules", потом закрываю и запускаю свою программу на ПК и данные начинают идти нормальные. То есть выходит если я один раз открою порт другой программой и закрою, то потом моя программа работает корректно...Фантастика!
Что же я упустил, может нужно еще как-то выходной драйвер кома настраивать?

Сообщение отредактировал Twen - Feb 28 2012, 15:01
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 29 2012, 10:12
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Уберите вызов GetCommState и заполните явно все поля структуры dcb
Может поможет
Go to the top of the page
 
+Quote Post
Twen
сообщение Feb 29 2012, 12:45
Сообщение #28


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543



Ок, попробую...интересно, интересно, что у функции :
ReadFile(handle, (uint8_t *)buf, numbytes, &numbytes_ok, NULL);
значение numbytes - количество ожидаемых байт не может быть больше 255, так как тип char...
мне просто нужно 256 )), приходится два раза вызывать...

Сообщение отредактировал Twen - Feb 29 2012, 12:46
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Feb 29 2012, 13:26
Сообщение #29


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(Twen @ Feb 29 2012, 16:45) *
Ок, попробую...интересно, интересно, что у функции :
ReadFile(handle, (uint8_t *)buf, numbytes, &numbytes_ok, NULL);
значение numbytes - количество ожидаемых байт не может быть больше 255, так как тип char...
мне просто нужно 256 )), приходится два раза вызывать...


где тип char? Откройте winbdows.h (или где оно там описано) и посмотрите прототип. Или любой хелп.
зы: и что вы будете делать, если данные вдруг начнуться не с границы Вашего буфера в 256 байт?
ps2: при некоторых настройках timeouts число прочитанных может быть меньше ожидаемых байт.
ps3: делать приведение типа перед присвоением к "void *" это сильно улучшает читабельность, наверное?

Сообщение отредактировал Genadi Zawidowski - Feb 29 2012, 13:30
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 03:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.08049 секунд с 7
ELECTRONIX ©2004-2016