![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
GreatShogun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.8.2012 Репутация: нет Всего: нет |
Решил написать програмку, в которой COM port будем общаться с контроллером шаговых двигателей) ну собсно спецификация у контроллера такова что есть 9-й бит который сообщает о том адрес в 8 битах перед ним или нет! вопрос в том как это реализовать! пробывал использовать паритет, но ничего путного пока не вышло!
|
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
если доступно кодить на обеих сторонах,
чем не устраивает 8-битный трансфер на обеих сторонах: контроллер набирает 8 бит, шлет их в UART, 1 бит оставляет в буфере, следующие 7 бит склеивает с оставшимся, посылает их и оставляет в буфере 2 бита и т.д., пока в очередь с буфером, в сумме не придет 16 бит, после чего буфер опустошается и все начинается по новой на приемной стороне точно так же Добавлено через 1 минуту и 34 секунды нужно только предусмотреть команду flush, которая очищает текущий буфер, дополняя его биты нулями и посылая в UART -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
GreatShogun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.8.2012 Репутация: нет Всего: нет |
В том то и дело что перепрограмировать контроллер нет никакой возможности) надо реализовать именно 9-ти битную)
|
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
есть реализации UART, которые понимают 9 бит, и если контроллер, использует именно такой UART, то на приемной стороне надо выставить в DCB::ByteSize значение 9, если же контроллер ничего не знает об UART и шлет импульсы в "провод" по своему усмотрению, то по моему без дополнительного преобразователя не обойтись
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
GreatShogun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.8.2012 Репутация: нет Всего: нет |
дополнительный преобразователь?
|
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
еще один контроллер, который понимает эти 9 бит и ретранслирует их в обычные 8 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
bass |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Ребят сума сошли что за грабли когда есть возможность на компе организовать UART 8 и 9.... Мы будем посылать 8 и преборазовывать в 9.... Настрой ки ком порта , приношу извинения за то что это на борланде и нет описаний чек боксов и т.д
И смотрите напрямую микроконтроллер нельзя соединить с ком портом компьютера..... Насколько помню надо max232 ставить. |
||||
|
|||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
успокойся, bass, преобразователь нужен только если это не UART, как я уже сказал
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
bass |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Преобразователь сигналов с компа по документации +-12в точно не помню а микроконтроллер воспринимает +- 5в...... И потом соглосовать на какой скорости работает микроконтроллер и все его настройки..... Если схема не твоя то слоноватенько будет.... а вот сопряжение микроконтроллера. http://my-avr.at.ua/publ/1-1-0-12 Прочитал повнимательнее ТС. У него контроллер уже со спецификацией, пусть в студию даст ее и посмотрим нужно ли согласование, и какие настроички выставить.... dcb.ByteSize= 9; Это сообщение отредактировал(а) bass - 13.8.2012, 11:59 |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
с этого и надо было начинать читать умеем - уже хорошо, осталось - перестать флудить ![]() -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
GreatShogun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.8.2012 Репутация: нет Всего: нет |
bass, то есть достаточно просто задать размер байта для компорта равным 9? и совать туда вместо char, 9-битную переменную?
|
|||
|
||||
bass |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Для восми битного так.
Должно вот так заработать, только может придеться поставить в проге однобайтовое выравнивание надо пробовать. Асцилограф есть под рукой??? Могу ради интереса попробывать только вечерком часиков в 11. А вот и ответ http://www.gotdotnet.ru/forums/2/83741/675592/ Это сообщение отредактировал(а) bass - 13.8.2012, 12:38 |
||||
|
|||||
GreatShogun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.8.2012 Репутация: нет Всего: нет |
Ну я с паритетом пробывал) ща еще покавыряю) если к 11 часам сделаю напишу тут!) а если нет то помощь мне не повредит!))
Добавлено через 3 минуты и 26 секунд А может у меня в коде где то косяк!
|
|||
|
||||
bass |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Сейчас не могу посмотреть все....
но в глаза килаеться... SerialPort::WriteToCOM(BYTE mess) Зачем стринг?????? Если 8 бит передача то BYTE.....
|
|||
|
||||
GreatShogun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.8.2012 Репутация: нет Всего: нет |
лучше по одному байту слать? string для более удобного взаимодействия с интерфейсом.
Добавлено через 5 минут и 45 секунд так то 9-бит просто я паритет пытался тут использовать) то есть девятый бит - бит четности |
|||
|
||||
deniska |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
выставили режим с 9-м битом:
послали адресный байт, выставили обычный режим:
послали данные. |
||||
|
|||||
GreatShogun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.8.2012 Репутация: нет Всего: нет |
У адреса 9-бит наоборот нулевой, но не суть вообщем то. Главное что не присваевается...
|
|||
|
||||
bass |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Могу сказать не чего хорошего, походу винда не дает менять настройки.........
9 бит вообще не устанавливаеться. А вот так первый ресунок. dcb.Parity=0; dcb.StopBits=ONESTOPBIT;//Form1->CheckBox2->Checked; Вот так не дает выставить dcb.Parity=0; dcb.StopBits=1;//Form1->CheckBox2->Checked; второй рисунок dcb.Parity=0; dcb.StopBits=2;//Form1->CheckBox2->Checked; и третий рисунок dcb.Parity=1; dcb.StopBits=0;//Form1->CheckBox2->Checked; http://s1.ipicture.ru/uploads/20120816/y84V42ao.jpg http://s1.ipicture.ru/uploads/20120816/H0w1HE5U.jpg http://s1.ipicture.ru/uploads/20120816/wX7A27kZ.jpg Число в порт всевремя слал 170............... Походу не дает винда возможности выставить 9 бит.......((((((((((( У меня ХР.... Но кстатии уменя USB ком порт, может дело в нем........ Вечерком могу попробывать на обычном....... Это сообщение отредактировал(а) bass - 16.8.2012, 12:43 |
|||
|
||||
bass |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Попробовал на встроенном в материнскую плату компорте... Увы но эти биты не изминились...... Хотя комп порт обязан их поддерживать всетаки это стандарт......... А вот написатели виндовса так не думали...((((((( Драйвер тогда один выход писать, либо комутировать через какоето устройство......
|
|||
|
||||
kuzulis |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: 1 Всего: 1 |
Никто никому не обязан, 9 бит это не стандарт. Единственный способ сЪэмулировать 9 бит так, как сказал deniska Мы паритетом типа Mark/Space добавляем этот девятый бит и можем слать в ШД. Если мы хотим прочитать от контроллера 9 бит, то нужно читать в режиме Mark/Space и проверять на ошибки паритета. Типа если у нас Mark режим, значит 9-й бит должен быть в 1, поэтому, если мы приняли от ШД данные без ошибок, значит 9-й бит был 1, если с ошибкой паритета - значит он был 0. Как то так, т.е. косвенно определить этот бит. Это сообщение отредактировал(а) kuzulis - 16.8.2012, 16:55 |
|||
|
||||
bass |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
А куда тогда подевался стоп бит.....?????? Что то я не увидел его в осцилограмме..............
Ради прикола посмотрю завтра когда буду работать, получиться ли как писалось выше............ Это сообщение отредактировал(а) bass - 16.8.2012, 22:53 |
|||
|
||||
GreatShogun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.8.2012 Репутация: нет Всего: нет |
Пробывал то же самое, и 9 бит проставлять, и паритет у меня не вышло, возможно легче найти стороннюю библиотеку, чем писать свой драйвер?
Это сообщение отредактировал(а) GreatShogun - 17.8.2012, 07:40 |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
посмотрите еще раз внимательнее на настройки при открытии порта,
fParity = TRUE; // enable parity checking не забыли сделать? у нас такой механизм с адресным байтом работает, правда и железка своего производства. данный ШД точно приспособлен к обмену с компом? возможно к нему еще плата драйвера предусмотрена для обмена с компьютером...
|
|||
|
||||
GreatShogun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.8.2012 Репутация: нет Всего: нет |
Да все совпадает, единственно fBinary у меня FALSE;
|
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
GreatShogun, еще я один нюанс упустил: сейчас уже не помню для чего именно, но у меня сделана временная задержка между
WriteFile для адресного байта и снятием признака 9-го бита. 100-200мксек достаточно, если время передачи критично, или простой Sleep(1) поставьте, но это уже намного больше будет(~15мсек в обычном режиме или 2-3мсек при использовании timeBeginPeriod ). Точно знаю что без этой задержки не вязались... позднее уточню причину. ПС. надеюсь еще забросили эту идею, главное пытаться... ![]() ппс: по-моему такой финт связан с задержками в передаче данных виндой. то что мы вызвали writefile - не значит что байт мгновенно передался. если задержку не поставить, то велика вероятность того, что адресный байт уйдет уже со сброшенным 9-м битом. както так.... Это сообщение отредактировал(а) deniska - 22.8.2012, 07:57 |
|||
|
||||
GreatShogun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.8.2012 Репутация: нет Всего: нет |
Спасибо, что занимаетесь проблемой) Честно говоря не понимаю откуда такая сложность UART 2 и 3, распространены и известны, однако не могу найти ни одного рабочего примера того как работает 9-битная передача, хотя и RS-485 весьма распространенный протокол... попробую задержки поставить посмотрим что получится.
|
|||
|
||||
casey |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.12.2006 Где: Украина Репутация: нет Всего: 2 |
MARKPARITY и SPACEPARITY поддерживается не всеми микросхемами UART (видимо твоей и не поддерживается, на моем компе кстати тоже), я делал расчет кол-ва еденичек в отправляемом байте и в зависимости от результата выставлял EVEN или ODD. Можешь поотправлять один байт в цикле - осциллографом увидишь 11 бит - стартовый, 8 бит данных, 1 четности, стоповый.
Настройку DCB делал так:
Это сообщение отредактировал(а) casey - 22.8.2012, 16:27 |
|||
|
||||
GreatShogun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.8.2012 Репутация: нет Всего: нет |
Задержки действительно помогли) спасибо)
|
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
урря |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
У UART'е в РС есть встроенное FIFO, так что отправляемые и принимаемые байты появляются на линии не сразу, а с некоторой неопределенной задержкой. С другой стороны манипуляции с Parity (как для передачи так и для приема) отрабатываются драйвером немедленно, и асинхронно с собственно процессом передачи и приема. Поэтому про FIFO можете сразу забыть, и задержки при передаче нужны именно по этой причине - что бы байты успели физически уйти в линию до того, как вы поменяете порту настройки PARITY
|
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Короче все методы через жопу, хотелось бы у ТС узнать название микросхемы которая работает с нестандартным RS232
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |