Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 9-бит через COM port 
:(
    Опции темы
deniska
Дата 14.8.2012, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



выставили режим с 9-м битом:
Код

    if(GetCommState(Handle,&MyDCB)==0) return -1;
    MyDCB.Parity=MARKPARITY;
    if(SetCommState(Handle,&MyDCB)==0)return -1;


послали адресный байт,
выставили обычный режим:
Код

    if(GetCommState(Handle,&MyDCB)==0) return -1;
    MyDCB.Parity=SPACEPARITY;
    if(SetCommState(Handle,&MyDCB)==0)return -1;

послали данные.
PM MAIL ICQ   Вверх
GreatShogun
Дата 14.8.2012, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 12.8.2012

Репутация: нет
Всего: нет



У адреса 9-бит наоборот нулевой, но не суть вообщем то. Главное что не присваевается...
PM MAIL   Вверх
bass
Дата 16.8.2012, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
bass
Дата 16.8.2012, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Попробовал на встроенном в материнскую плату компорте... Увы но эти биты не изминились...... Хотя комп порт обязан их поддерживать всетаки это стандарт.........  А вот написатели виндовса так не думали...((((((( Драйвер тогда один выход писать, либо комутировать через какоето устройство......
PM MAIL   Вверх
kuzulis
Дата 16.8.2012, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
bass
Дата 16.8.2012, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



А куда тогда подевался стоп бит.....?????? Что то я не увидел его в осцилограмме..............
Ради прикола посмотрю завтра когда буду работать, получиться ли как писалось выше............ 

Это сообщение отредактировал(а) bass - 16.8.2012, 22:53
PM MAIL   Вверх
GreatShogun
Дата 17.8.2012, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 12.8.2012

Репутация: нет
Всего: нет



Пробывал то же самое, и 9 бит проставлять, и паритет у меня не вышло, возможно легче найти стороннюю библиотеку, чем писать свой драйвер?

Это сообщение отредактировал(а) GreatShogun - 17.8.2012, 07:40
PM MAIL   Вверх
deniska
Дата 17.8.2012, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



посмотрите еще раз внимательнее на настройки при открытии порта,
fParity = TRUE;          // enable parity checking
не забыли сделать?

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

Код

    COMMTIMEOUTS tout; // Струтура, описавающая времена ожидания (таймауты)

    // Открытие порта
    Handle=CreateFile( Name, GENERIC_WRITE|GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    
    if( Handle == INVALID_HANDLE_VALUE )
    {
        DWORD res = GetLastError();
        return -1;
    }
    
    //Задание размера буфера в байтах
    
    fl = SetupComm( Handle, 3000, 3000 );  //
    if( fl == 0 ) 
        return -1;
    
    //Задание таймаутов
    tout.ReadIntervalTimeout = TimeOut;
    tout.ReadTotalTimeoutMultiplier = TimeOut;
    tout.ReadTotalTimeoutConstant = TimeOut;
    tout.WriteTotalTimeoutMultiplier = TimeOut;
    tout.WriteTotalTimeoutConstant = TimeOut;
    fl = SetCommTimeouts( Handle, &tout ); // !!!
    if( fl == 0 ) 
        return -1;

    //Считывание текущего состояния DCB (
    fl = GetCommState( Handle, &MyDCB );  // !!!
    if( fl == 0 )
        return -1;

    //Заполнение DCB
    MyDCB.BaudRate = BaudRate;     // current baud rate
    MyDCB.fBinary = TRUE;          // binary mode, no EOF check
    MyDCB.fParity = TRUE;          // enable parity checking
 
        MyDCB.fOutxCtsFlow = FALSE;      // CTS output flow control
        MyDCB.fRtsControl = RTS_CONTROL_DISABLE;       // RTS flow control
 
    MyDCB.fOutxDsrFlow = FALSE;      // DSR output flow control
    MyDCB.fDtrControl = DTR_CONTROL_DISABLE;       // DTR flow control type
    
    MyDCB.fDsrSensitivity = FALSE;   // DSR sensitivity
    MyDCB.fTXContinueOnXoff = 0; // XOFF continues Tx
    MyDCB.fOutX = 0;            // XON/XOFF out flow control
    MyDCB.fInX = 0;             // XON/XOFF in flow control
    MyDCB.fErrorChar = 0;       // enable error replacement
    MyDCB.fNull = 0;            // enable null stripping

    MyDCB.fAbortOnError = 0;     // abort reads/writes on error
    MyDCB.XonLim = 0;               // transmit XON threshold
    MyDCB.XoffLim = 0;              // transmit XOFF threshold
    MyDCB.ByteSize = DataBit;       // number of bits/byte, 4-8

    switch( StopBit )
    { 
        case 1:    
            MyDCB.StopBits = 0;            // 0,1,2 = 1, 1.5, 2
            break;
        case 2:    
            MyDCB.StopBits=1;
            break;
    }
     
    MyDCB.XonChar = 0;              // Tx and Rx XON character
    MyDCB.XoffChar = 0;             // Tx and Rx XOFF character
    MyDCB.ErrorChar = 0;            // error replacement character
    MyDCB.EofChar = 0;              // end of input character
    MyDCB.EvtChar = 0;              // received event character
    MyDCB.wReserved1;           // reserved; do not use

     //Настройка порта в соответствии с заполненным DCB
    fl = SetCommState( Handle, &MyDCB );  // !!!
    if( fl == 0 ) 
        return -1;
    return 0;



PM MAIL ICQ   Вверх
GreatShogun
Дата 17.8.2012, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 12.8.2012

Репутация: нет
Всего: нет



Да все совпадает, единственно fBinary у меня FALSE;
PM MAIL   Вверх
deniska
Дата 22.8.2012, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



GreatShogun,  еще я один нюанс упустил: сейчас уже не помню для чего именно, но у меня сделана временная задержка между
WriteFile для адресного байта и снятием признака 9-го бита. 100-200мксек достаточно, если время передачи критично, или простой Sleep(1) поставьте, но это уже намного больше будет(~15мсек в обычном режиме или 2-3мсек при использовании timeBeginPeriod ).

Точно знаю что без этой задержки не вязались... позднее уточню причину. 
ПС. надеюсь еще забросили эту идею, главное пытаться... smile 


ппс: по-моему такой финт связан с задержками в передаче данных виндой. то что мы вызвали writefile - не значит что байт мгновенно передался. если задержку не поставить, то велика вероятность того, что адресный байт уйдет уже со сброшенным 9-м битом. както так....

Это сообщение отредактировал(а) deniska - 22.8.2012, 07:57
PM MAIL ICQ   Вверх
GreatShogun
Дата 22.8.2012, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 12.8.2012

Репутация: нет
Всего: нет



Спасибо, что занимаетесь проблемой) Честно говоря не понимаю откуда такая сложность UART 2 и 3, распространены и известны, однако не могу найти ни одного рабочего примера того как работает 9-битная передача, хотя и RS-485 весьма распространенный протокол... попробую задержки поставить посмотрим что получится.
PM MAIL   Вверх
casey
Дата 22.8.2012, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 20.12.2006
Где: Украина

Репутация: нет
Всего: 2



MARKPARITY и SPACEPARITY поддерживается не всеми микросхемами UART (видимо твоей и не поддерживается, на моем компе кстати тоже), я делал расчет кол-ва еденичек в отправляемом байте и в зависимости от результата выставлял EVEN или ODD. Можешь поотправлять один байт в цикле - осциллографом увидишь 11 бит - стартовый, 8 бит данных, 1 четности, стоповый.

Настройку DCB делал так:

Код

    GetCommState(hComPort, &dcb1);
    dcb1.BaudRate=9600;
    dcb1.fBinary=1;
    dcb1.fParity=1;
    dcb1.fDtrControl=0;
    dcb1.Parity=MARKPARITY;

    dcb1.ByteSize=8;//databits;
    dcb1.StopBits =ONESTOPBIT; //stopbits;
    dcb1.fOutxCtsFlow=0;
    dcb1.fOutxDsrFlow=0;
    dcb1.fDsrSensitivity=0;
    dcb1.fOutX=0;
    dcb1.fInX=0;
    SetCommState(hComPort, &dcb1);



Это сообщение отредактировал(а) casey - 22.8.2012, 16:27
PM MAIL WWW   Вверх
GreatShogun
Дата 22.8.2012, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 12.8.2012

Репутация: нет
Всего: нет



Задержки действительно помогли) спасибо)
PM MAIL   Вверх
deniska
Дата 23.8.2012, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



Цитата
Задержки действительно помогли
 
урря
PM MAIL ICQ   Вверх
xvr
Дата 24.8.2012, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



У UART'е в РС есть встроенное FIFO, так что отправляемые и принимаемые байты появляются на линии не сразу, а с некоторой неопределенной задержкой. С другой стороны манипуляции с Parity (как для передачи так и для приема) отрабатываются драйвером немедленно, и асинхронно с собственно процессом передачи и приема. Поэтому про FIFO можете сразу забыть, и задержки при передаче нужны именно по этой причине - что бы байты успели физически уйти в линию до того, как вы поменяете порту настройки PARITY

PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1395 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.