Перейти к содержанию
    

Не получаеться считать данные из COM порта на ПК

Вот такая проблемка. Делаю я устройство, одной из функций которого являеться связь с ПК по RS-232. Для чтения COM порта на ПК я написал програмку на Delphi и получилась вот такая неприятная ситуация:

(два ком порта соеденены Rx-Tx)

При чтении данных из буфера к некоторым байтам прибавляеться 128 и при чем тут нет никакой закономерности. Вот пример отправленных и полученных байт:

 

отправил получил

49 | 177

50 | 178

51 | 51

52 | 180

53 | 53

54 | 54

55 | 183

56 | 184

57 | 57

 

И еще одна проблема при передаче одного байта все нормально, а когда я передаю хотя бы два байта подряд, то получаеться вообще черт знает что.

 

Использовал компоненты ComPort от Winsoft, и ComDrv32.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала попробуйте передавать и принимать не блоками, а байтом (т.е. блок состоящий из одного элемента). Если все будет нормально увеличте на один и т.д. Когда обнаружиться ошибка вот тогда и надо будет разбираться.

За одно проверьте правильность настройки Ваших портов - они должны быть полностью одинаковы настроены (только один на прием а другой на передачу).

А для написания программы для портов лучше разберитесь с функциями WinAPI. Это будет гораздо полезней. Будете все это писать сами без использования каких либо сторонних библиотек.

Вот Вам пара прекрасных статей:

COM.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С глюками при посылке нескольких байт поборолся, а вот не могу побороть вторую проблему.

Когда я посылаю из Comspy в свою программу числа они поче му то искажаються по непонятному закону. Оба порта настроены идентично.

И вообще возможно ли чтение из буфера первых 16 символов ANSI кода.?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С глюками при посылке нескольких байт поборолся, а вот не могу побороть вторую проблему.

Когда я посылаю из Comspy в свою программу числа они поче му то искажаються по непонятному закону. Оба порта настроены идентично.

  И вообще возможно ли чтение из буфера первых 16 символов ANSI кода.?

 

Тогда по всей видимости придется Вам разбираться с byte-форматом посылаемый из Comspy. Возможно что идет передача какого-то информационного контекста вместе с Вашими данными о котором Вы не имеете никакого представления. Так что необходимо разобраться что 'выплевывает' Comspy.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раз уж ты принимаешь при помощи Delphi, то и передавай при ее помощи байты. Тогда уж точно будешь знать что передается и что принимается. А у меня была схожая проблема когда работал уже с устройством на AVR. Частота не совпадала толи на 7% толи на 10%, поэтому периодически один бит выскакивал лишний, как раз в конце, там где стоп бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раз уж ты принимаешь при помощи Delphi, то и передавай при ее помощи байты. Тогда уж точно будешь знать что передается и что принимается. А у меня была схожая проблема когда работал уже с устройством на AVR. Частота не совпадала толи на 7% толи на 10%, поэтому периодически один бит выскакивал лишний, как раз в конце, там где стоп бит.

 

Тут бы добавить, как передаются байты через заглушку - сам на себя. Формат порта при этом точно совпадает, остаются проблемы с обработкой. Я передавал с компа на комп и если символы выдавались быстрее, чем через 5 -10 мс, то они пропадали.

Удачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  49      |    177

  50      |    178

  51      |      51

  52      |    180

  53      |      53

  54      |      54

  55      |    183

  56      |    184

  57      |      57

 

 

 

Шумит старший разряд.

Не совпадение скорости передачи. Видимо, вы пользуете миароконтроллер от внутреннего генератора, а не от внешнего кварцевого резонатора. В случаях использования внутренних генераторов, нужно индивидуально, для каждого контроллера подбирать делитель. То есть, генерить на пин прямоугольники и смотреть частоту. После этого высчитывать делитель. Если так не делать, то можно очень встрять, например при прогреве или переохлаждениии устройства. Как раз начинает шуметь старший бит.

В одном проекте(от -65градусов, до +65), даже пришлось считывать температуру с термодатчика и в соответствии с этим подстраивать делитель.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотя действительно я работаю от внутреннего генератора, но дело тут не в этом. Это даже проявляеться когда я шлю данные с одного COM-порта на другой. Скорее всего я пропустил один из параметров при настройке ком порта. Но на данный момент, при использовании другого компонента, это не проявляеться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для облегчения отладки программ обмена с устройствами через СОМ порт есть замечательная программа portmon.

Она "садится верхом" на выбранный порт и отслеживает весь обмен по нему.

Т.е. программа пользователя, написанная, например, на Delphi, даже не "чувствует" ее присутствия.

При этом показывается время событий, что именно произошло - например, имел место запрос на 15 байт (функция Windows), реально получено 7 и произошел таймаут, или получены все 15 успешно и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...