|
Работа с ком портом в Eclipce CDT |
|
|
|
Feb 17 2012, 15:47
|

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

|
Цитата А если не полениться и как следует освоить этот инструмент, то он оказывается на удивление гибким и удобным. Нет уж. Все, что мне нужно я готовлю сам.
--------------------
Талант не пропить ...
|
|
|
|
|
Feb 17 2012, 23:38
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 18 2012, 10:46
|
Частый гость
 
Группа: Участник
Сообщений: 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 чтобы порт не выс и корректно принимал байты. .
|
|
|
|
|
Feb 19 2012, 13:42
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Twen @ Feb 19 2012, 15:07)  Тогда получается ненужно никаких циклов ожидания... Точно Цитата а тогда функцию ClearCommError() обязательно вызывать перед чтением или записью? Нет, Ее надо звать после того, как функции Read/WriteFile вернутся с ошибкой, что бы можно было еще раз попробовать передать/принять данные из COM порта.
|
|
|
|
|
Feb 28 2012, 14:59
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 7-02-09
Пользователь №: 44 543

|
Все вроде бы работает, но заметил один момент... Когда я включаю компьютер и запускаю свою программу для работы с COM-портом, то при выводе выводятся нули...снифером смотрю, ком открыт и передаются не нули, но на плату, которая подключена к ПК приходят нули, снифер показывается нормальные данные. Но когда я открываю ком-порт программкой для работы с СОМ "Hercules", потом закрываю и запускаю свою программу на ПК и данные начинают идти нормальные. То есть выходит если я один раз открою порт другой программой и закрою, то потом моя программа работает корректно...Фантастика! Что же я упустил, может нужно еще как-то выходной драйвер кома настраивать?
Сообщение отредактировал Twen - Feb 28 2012, 15:01
|
|
|
|
|
Feb 29 2012, 12:45
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 29 2012, 13:26
|

Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|