Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > 9-бит через COM port |
Автор: GreatShogun 12.8.2012, 19:44 |
Решил написать програмку, в которой COM port будем общаться с контроллером шаговых двигателей) ну собсно спецификация у контроллера такова что есть 9-й бит который сообщает о том адрес в 8 битах перед ним или нет! вопрос в том как это реализовать! пробывал использовать паритет, но ничего путного пока не вышло! |
Автор: GremlinProg 13.8.2012, 07:08 |
если доступно кодить на обеих сторонах, чем не устраивает 8-битный трансфер на обеих сторонах: контроллер набирает 8 бит, шлет их в UART, 1 бит оставляет в буфере, следующие 7 бит склеивает с оставшимся, посылает их и оставляет в буфере 2 бита и т.д., пока в очередь с буфером, в сумме не придет 16 бит, после чего буфер опустошается и все начинается по новой на приемной стороне точно так же Добавлено через 1 минуту и 34 секунды нужно только предусмотреть команду flush, которая очищает текущий буфер, дополняя его биты нулями и посылая в UART |
Автор: GreatShogun 13.8.2012, 10:16 |
В том то и дело что перепрограмировать контроллер нет никакой возможности) надо реализовать именно 9-ти битную) |
Автор: GremlinProg 13.8.2012, 10:37 |
есть реализации UART, которые понимают 9 бит, и если контроллер, использует именно такой UART, то на приемной стороне надо выставить в DCB::ByteSize значение 9, если же контроллер ничего не знает об UART и шлет импульсы в "провод" по своему усмотрению, то по моему без дополнительного преобразователя не обойтись |
Автор: GreatShogun 13.8.2012, 10:41 |
дополнительный преобразователь? |
Автор: GremlinProg 13.8.2012, 11:15 |
еще один контроллер, который понимает эти 9 бит и ретранслирует их в обычные 8 |
Автор: bass 13.8.2012, 11:27 | ||||
Ребят сума сошли что за грабли когда есть возможность на компе организовать UART 8 и 9.... Мы будем посылать 8 и преборазовывать в 9.... Настрой ки ком порта , приношу извинения за то что это на борланде и нет описаний чек боксов и т.д
И смотрите напрямую микроконтроллер нельзя соединить с ком портом компьютера..... Насколько помню надо max232 ставить. |
Автор: GremlinProg 13.8.2012, 11:32 |
успокойся, bass, преобразователь нужен только если это не UART, как я уже сказал |
Автор: bass 13.8.2012, 11:55 | ||
Преобразователь сигналов с компа по документации +-12в точно не помню а микроконтроллер воспринимает +- 5в...... И потом соглосовать на какой скорости работает микроконтроллер и все его настройки..... Если схема не твоя то слоноватенько будет.... а вот сопряжение микроконтроллера. http://my-avr.at.ua/publ/1-1-0-12 Прочитал повнимательнее ТС. У него контроллер уже со спецификацией, пусть в студию даст ее и посмотрим нужно ли согласование, и какие настроички выставить.... dcb.ByteSize= 9; |
Автор: GremlinProg 13.8.2012, 12:07 |
с этого и надо было начинать читать умеем - уже хорошо, осталось - перестать флудить ![]() |
Автор: GreatShogun 13.8.2012, 12:14 |
bass, то есть достаточно просто задать размер байта для компорта равным 9? и совать туда вместо char, 9-битную переменную? |
Автор: bass 13.8.2012, 12:31 | ||||
Для восми битного так.
Должно вот так заработать, только может придеться поставить в проге однобайтовое выравнивание надо пробовать. Асцилограф есть под рукой??? Могу ради интереса попробывать только вечерком часиков в 11. А вот и ответ http://www.gotdotnet.ru/forums/2/83741/675592/ |
Автор: GreatShogun 13.8.2012, 12:52 | ||
Ну я с паритетом пробывал) ща еще покавыряю) если к 11 часам сделаю напишу тут!) а если нет то помощь мне не повредит!)) Добавлено через 3 минуты и 26 секунд А может у меня в коде где то косяк!
|
Автор: bass 13.8.2012, 13:05 | ||
Сейчас не могу посмотреть все.... но в глаза килаеться... SerialPort::WriteToCOM(BYTE mess) Зачем стринг?????? Если 8 бит передача то BYTE.....
|
Автор: GreatShogun 13.8.2012, 13:20 |
лучше по одному байту слать? string для более удобного взаимодействия с интерфейсом. Добавлено через 5 минут и 45 секунд так то 9-бит просто я паритет пытался тут использовать) то есть девятый бит - бит четности |
Автор: deniska 14.8.2012, 12:55 | ||||
выставили режим с 9-м битом:
послали адресный байт, выставили обычный режим:
послали данные. |
Автор: GreatShogun 14.8.2012, 13:48 |
У адреса 9-бит наоборот нулевой, но не суть вообщем то. Главное что не присваевается... |
Автор: bass 16.8.2012, 12:24 |
Могу сказать не чего хорошего, походу винда не дает менять настройки......... 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, 15:15 |
Попробовал на встроенном в материнскую плату компорте... Увы но эти биты не изминились...... Хотя комп порт обязан их поддерживать всетаки это стандарт......... А вот написатели виндовса так не думали...((((((( Драйвер тогда один выход писать, либо комутировать через какоето устройство...... |
Автор: kuzulis 16.8.2012, 16:52 | ||
Никто никому не обязан, 9 бит это не стандарт. Единственный способ сЪэмулировать 9 бит так, как сказал deniska Мы паритетом типа Mark/Space добавляем этот девятый бит и можем слать в ШД. Если мы хотим прочитать от контроллера 9 бит, то нужно читать в режиме Mark/Space и проверять на ошибки паритета. Типа если у нас Mark режим, значит 9-й бит должен быть в 1, поэтому, если мы приняли от ШД данные без ошибок, значит 9-й бит был 1, если с ошибкой паритета - значит он был 0. Как то так, т.е. косвенно определить этот бит. |
Автор: bass 16.8.2012, 22:46 |
А куда тогда подевался стоп бит.....?????? Что то я не увидел его в осцилограмме.............. Ради прикола посмотрю завтра когда буду работать, получиться ли как писалось выше............ |
Автор: GreatShogun 17.8.2012, 07:40 |
Пробывал то же самое, и 9 бит проставлять, и паритет у меня не вышло, возможно легче найти стороннюю библиотеку, чем писать свой драйвер? |
Автор: deniska 17.8.2012, 07:58 | ||
посмотрите еще раз внимательнее на настройки при открытии порта, fParity = TRUE; // enable parity checking не забыли сделать? у нас такой механизм с адресным байтом работает, правда и железка своего производства. данный ШД точно приспособлен к обмену с компом? возможно к нему еще плата драйвера предусмотрена для обмена с компьютером...
|
Автор: GreatShogun 17.8.2012, 14:04 |
Да все совпадает, единственно fBinary у меня FALSE; |
Автор: deniska 22.8.2012, 07:49 |
GreatShogun, еще я один нюанс упустил: сейчас уже не помню для чего именно, но у меня сделана временная задержка между WriteFile для адресного байта и снятием признака 9-го бита. 100-200мксек достаточно, если время передачи критично, или простой Sleep(1) поставьте, но это уже намного больше будет(~15мсек в обычном режиме или 2-3мсек при использовании timeBeginPeriod ). Точно знаю что без этой задержки не вязались... позднее уточню причину. ПС. надеюсь еще забросили эту идею, главное пытаться... ![]() ппс: по-моему такой финт связан с задержками в передаче данных виндой. то что мы вызвали writefile - не значит что байт мгновенно передался. если задержку не поставить, то велика вероятность того, что адресный байт уйдет уже со сброшенным 9-м битом. както так.... |
Автор: GreatShogun 22.8.2012, 09:37 |
Спасибо, что занимаетесь проблемой) Честно говоря не понимаю откуда такая сложность UART 2 и 3, распространены и известны, однако не могу найти ни одного рабочего примера того как работает 9-битная передача, хотя и RS-485 весьма распространенный протокол... попробую задержки поставить посмотрим что получится. |
Автор: casey 22.8.2012, 16:11 | ||
MARKPARITY и SPACEPARITY поддерживается не всеми микросхемами UART (видимо твоей и не поддерживается, на моем компе кстати тоже), я делал расчет кол-ва еденичек в отправляемом байте и в зависимости от результата выставлял EVEN или ODD. Можешь поотправлять один байт в цикле - осциллографом увидишь 11 бит - стартовый, 8 бит данных, 1 четности, стоповый. Настройку DCB делал так:
|
Автор: GreatShogun 22.8.2012, 20:00 |
Задержки действительно помогли) спасибо) |
Автор: deniska 23.8.2012, 10:58 | ||
урря |
Автор: xvr 24.8.2012, 11:00 |
У UART'е в РС есть встроенное FIFO, так что отправляемые и принимаемые байты появляются на линии не сразу, а с некоторой неопределенной задержкой. С другой стороны манипуляции с Parity (как для передачи так и для приема) отрабатываются драйвером немедленно, и асинхронно с собственно процессом передачи и приема. Поэтому про FIFO можете сразу забыть, и задержки при передаче нужны именно по этой причине - что бы байты успели физически уйти в линию до того, как вы поменяете порту настройки PARITY |
Автор: Dem_max 27.8.2012, 12:04 |
Короче все методы через жопу, хотелось бы у ТС узнать название микросхемы которая работает с нестандартным RS232 |