Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(GreatShogun @  13.8.2012,  12:41 Найти цитируемый пост)
дополнительный преобразователь?

еще один контроллер, который понимает эти 9 бит и ретранслирует их в обычные 8

Автор: bass 13.8.2012, 11:27
Цитата(GremlinProg @ 13.8.2012,  11:15)
Цитата(GreatShogun @  13.8.2012,  12:41 Найти цитируемый пост)
дополнительный преобразователь?

еще один контроллер, который понимает эти 9 бит и ретранслирует их в обычные 8

Ребят сума сошли что за грабли когда есть возможность на компе организовать UART 8 и 9.... Мы будем посылать 8 и преборазовывать в 9....

Настрой ки ком порта , приношу извинения за то что это на борланде и нет описаний чек боксов и т.д

Код


HANDLE HanPORT = 0;
DCB dcb;

memset(&dcb,0,sizeof(dcb));
dcb.DCBlength=sizeof(dcb);


HanPORT = CreateFile(&NamePort[1], GENERIC_READ|GENERIC_WRITE, 0, NULL,OPEN_EXISTING, 0,NULL);



    if(HanPORT!=INVALID_HANDLE_VALUE)
    { Form1->Memo1->Lines->Add("Порт открыт");}
    else
    { Form1->Memo1->Lines->Add("Порт не открылся"); return;}



    if (!GetCommState(HanPORT,&dcb))
    {Form1->Memo1->Lines->Add("Не считались настройки"); return;}else
    {Form1->Memo1->Lines->Add("считались настройки");}

    dcb.BaudRate=StrToInt(ComboBox2->Text);
    dcb.ByteSize=StrToInt(ComboBox3->Text);;
    dcb.Parity=0;//Form1->CheckBox1->Checked;
    dcb.StopBits=ONESTOPBIT;//Form1->CheckBox2->Checked;
 //   dcb.fDtrControl = DTR_CONTROL_ENABLE;
 //   dcb.fRtsControl = RTS_CONTROL_DISABLE;

    if (!SetCommState(HanPORT,&dcb))
    {Form1->Memo1->Lines->Add("Не записались настройки"); return;}else
    {Form1->Memo1->Lines->Add("записались настройки");}

  COMMTIMEOUTS  CommTimeouts;
  GetCommTimeouts(HanPORT, &CommTimeouts); //получаем структуру CommTimeouts что бы не заполнять все вручную
  CommTimeouts.ReadIntervalTimeout =MAXDWORD;  //функция ReadFile возвращает
  CommTimeouts.ReadTotalTimeoutMultiplier = 0; //немедленно все имеющиеся
  CommTimeouts.ReadTotalTimeoutConstant = 0;   //байты в приемном буфере
  CommTimeouts.WriteTotalTimeoutMultiplier = 0;//общий тайм-аут для
  CommTimeouts.WriteTotalTimeoutConstant = 0;  //операции записи не используется.
  SetCommTimeouts(HanPORT, &CommTimeouts); //записываем измененную структуру





И смотрите напрямую микроконтроллер нельзя соединить с ком портом компьютера..... Насколько помню надо max232 ставить.


Автор: GremlinProg 13.8.2012, 11:32
успокойся, bass, преобразователь нужен только если это не UART, как я уже сказал

Автор: bass 13.8.2012, 11:55
Цитата(GremlinProg @ 13.8.2012,  11:32)
успокойся, bass, преобразователь нужен только если это не UART, как я уже сказал

Преобразователь сигналов с компа по документации +-12в точно не помню а микроконтроллер воспринимает +- 5в...... И потом соглосовать на какой скорости работает микроконтроллер и все его настройки..... Если схема не твоя то слоноватенько будет....

а вот сопряжение микроконтроллера.
http://my-avr.at.ua/publ/1-1-0-12 

Прочитал повнимательнее ТС. У него контроллер уже со спецификацией, пусть в студию даст ее и посмотрим нужно ли согласование, и какие настроички выставить.... 

dcb.ByteSize= 9;

Автор: GremlinProg 13.8.2012, 12:07
Цитата(bass @  13.8.2012,  13:55 Найти цитируемый пост)
Прочитал повнимательнее ТС.

с этого и надо было начинать
Цитата(GremlinProg @  13.8.2012,  12:37 Найти цитируемый пост)
надо выставить в DCB::ByteSize значение 9

Цитата(bass @  13.8.2012,  13:55 Найти цитируемый пост)
dcb.ByteSize= 9

читать умеем - уже хорошо,
осталось - перестать флудить smile

Автор: GreatShogun 13.8.2012, 12:14
bass, то есть достаточно просто задать размер байта для компорта равным 9? и совать туда вместо char, 9-битную переменную? 

Автор: bass 13.8.2012, 12:31
Код

WriteFile(HanPORT,&Buffer,1,&Bytes,0);

Для восми битного так.
Код

WriteFile(HanPORT,&Buffer,2,&Bytes,0);

Должно вот так заработать, только может придеться  поставить в проге однобайтовое выравнивание надо пробовать.

Асцилограф есть под рукой???

Могу ради интереса попробывать только вечерком часиков в 11.

А вот и ответ http://www.gotdotnet.ru/forums/2/83741/675592/

Автор: GreatShogun 13.8.2012, 12:52
Ну я с паритетом пробывал) ща еще покавыряю) если к 11 часам сделаю напишу тут!) а если нет то помощь мне не повредит!))

Добавлено через 3 минуты и 26 секунд
А может у меня в коде где то косяк! 

Код

bool SerialPort::CreateCOM(string name)
{
    LPCWSTR NameCom = StdStrToLpt(name);
    hCom = CreateFile(NameCom, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

    SetReadTimeout(1);
    SetWriteTimeout(1);
    SetSpeed(9600);
    SetParity(4);
    SetOtherSettings();

    SetupComm(hCom, 2000, 2000);

    PurgeComm(hCom, PURGE_RXCLEAR);

    if (hCom == INVALID_HANDLE_VALUE)
    {
        return false;
    }
    return true;
}

bool SerialPort::DestroyCOM()
{
    CloseHandle(hCom);
    return true;
}

bool SerialPort::CheckPortOpen()
{
    if (hCom == INVALID_HANDLE_VALUE)
    {
        return false;
    }
    return true;
}

void SerialPort::InitReadOverllaped()
{
    overlapped.hEvent = CreateEvent(NULL, true, true, NULL);    //создать сигнальный объект-событие для асинхронных операций
    SetCommMask(hCom, EV_RXCHAR);                            //установить маску на срабатывание по событию приёма байта в порт
}

void SerialPort::InitWriteOverllaped()
{
    overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);      //создать событие
}

void SerialPort::SetReadTimeout(int time)
{
    COMMTIMEOUTS touts;
    GetCommTimeouts(hCom, &touts);
    touts.ReadIntervalTimeout =  time * 1000;
    touts.ReadTotalTimeoutMultiplier = time * 1000;
    touts.ReadTotalTimeoutConstant = time * 1000;
    SetCommTimeouts(hCom, &touts);
}

void SerialPort::SetWriteTimeout(int time)
{
    COMMTIMEOUTS touts;
    GetCommTimeouts(hCom, &touts);
    touts.WriteTotalTimeoutMultiplier = time * 1000;
    touts.WriteTotalTimeoutConstant = time * 1000;
    SetCommTimeouts(hCom, &touts);
}

void SerialPort::SetSpeed(int speed)
{
    DCB dcb;

    bool wasChange = GetCommState(hCom, &dcb);


    if(speed == 9600)
    {
        dcb.BaudRate = CBR_9600;
    }
    else if (speed == 19200)
    {
        dcb.BaudRate = CBR_19200;
    }
    else if (speed == 38400)
    {
        dcb.BaudRate = CBR_38400;
    }
    else if (speed == 57600)
    {
        dcb.BaudRate = CBR_57600;
    }
    else if (speed == 115200)
    {
        dcb.BaudRate = CBR_115200;
    }
    else
    {
        dcb.BaudRate = CBR_9600;
    }

    if(wasChange)
    {
        wasChange = SetCommState(hCom, &dcb);
    }

}

void SerialPort::SetParity(int parity)
{
    DCB dcb;

    bool wasChange = GetCommState(hCom, &dcb);

    dcb.Parity = parity;

    if(wasChange)
    {
        wasChange = SetCommState(hCom, &dcb);
    }

}

void SerialPort::SetOtherSettings()
{
    DCB dcb;

    bool wasChange = GetCommState(hCom, &dcb);

    dcb.fBinary = FALSE;                                   //включаем двоичный режим обмена
    dcb.fParity = TRUE;                                   // разрешение контроля четности
    dcb.fOutxCtsFlow = FALSE;                              //выключаем режим слежения за сигналом CTS
    dcb.fOutxDsrFlow = FALSE;                              //выключаем режим слежения за сигналом DSR
    dcb.fDtrControl = DTR_CONTROL_DISABLE;                 //отключаем использование линии DTR
    dcb.fDsrSensitivity = FALSE;                           //отключаем восприимчивость драйвера к состоянию линии DSR
    dcb.fTXContinueOnXoff = FALSE;
    dcb.fOutX = FALSE;
    dcb.fInX = FALSE;
    dcb.fErrorChar = FALSE;
    dcb.fNull = FALSE;                                     //разрешить приём нулевых байтов
    dcb.fRtsControl = RTS_CONTROL_DISABLE;                 //отключаем использование линии RTS
    dcb.fAbortOnError = FALSE;                             //отключаем остановку всех операций чтения/записи при ошибке
    dcb.ByteSize = 8;                                      //задаём 9 бит в байте
    //dcb.Parity = 0;                                        //отключаем проверку чётности
    dcb.StopBits = 0;                                      //задаём один стоп-бит


    if(wasChange)
    {
        wasChange = SetCommState(hCom, &dcb);
    }
}

void SerialPort::ParityONOFF(bool logic)
{
    DCB dcb;

    bool wasChange = GetCommState(hCom, &dcb);

    if(logic)
    {
        dcb.fParity = TRUE;
    }
    else
    {
        dcb.fParity = FALSE;
    }


    if(wasChange)
    {
        wasChange = SetCommState(hCom, &dcb);
    }
}

bool SerialPort::WriteToCOM(string mess)
{
    DWORD temp, signal;    //temp - переменная-заглушка

    char* buf = new char[mess.length()];
    memcpy(buf, mess.c_str(), mess.length());
    bool writed = WriteFile(hCom, buf, mess.length(), &temp, &overlappedwr);

    signal = WaitForSingleObject(overlappedwr.hEvent, INFINITE);      //приостановить поток, пока не завершится перекрываемая операция WriteFile
    return !writed;
}

bool SerialPort::ReadFromCOM(string & mess, int bits, int timeout)
{
    COMSTAT comstat;        //структура текущего состояния порта, в данной программе используется для определения количества принятых в порт байтов
    DWORD btr = 1, temp, mask, signal;    //переменная temp используется в качестве заглушки

    timeout *= 1000;
    Sleep(timeout);

    WaitCommEvent(hCom, &mask, &overlapped);                //ожидать события приёма байта (это и есть перекрываемая операция)
    signal = WaitForSingleObject(overlapped.hEvent, 1);    //приостановить поток до прихода байта
    if(signal == WAIT_OBJECT_0)                        //если событие прихода байта произошло
    {
        if(GetOverlappedResult(hCom, &overlapped, &temp, true)) //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
        {
            if((mask & EV_RXCHAR)!=0)                    //если произошло именно событие прихода байта
            {
                ClearCommError(hCom, &temp, &comstat);        //нужно заполнить структуру COMSTAT
                btr = comstat.cbInQue;                           //и получить из неё количество принятых байтов

                if(btr)                                  //если действительно есть байты для чтения
                {
                    int leng = (int)btr;
                    char* buf = new char[leng];
                    string bufer = "";
                    for(int i = 0; i < leng; i++)
                    {
                        ReadFile(hCom, buf, 1, &temp, &overlapped);     //прочитать байты из порта в буфер программы
                        bufer += buf[0];
                    }
                    counter += leng;                                          //увеличиваем счётчик байтов
                    mess = string(bufer);
                    //mess = mess.substr(0, mess.length()-3);

                    if(bits < mess.length());
                    {
                        mess = mess.substr(0, bits-1);
                    }


                    return true;                          //вызываем функцию для вывода данных на экран и в файл
                }
             }
         }
     }

     return true;
}

void SerialPort::CloseReadOverllaped()
{
    CloseHandle(overlapped.hEvent);
}

void SerialPort::CloseWriteOverllaped()
{
    CloseHandle(overlappedwr.hEvent);
}

void SerialPort::PurgeCOM()
{
    PurgeComm(hCom, PURGE_RXCLEAR);
    PurgeComm(hCom, PURGE_TXCLEAR);             //очистить передающий буфер порта
}

Автор: bass 13.8.2012, 13:05
Сейчас не могу посмотреть все....

но в глаза килаеться... SerialPort::WriteToCOM(BYTE mess)

Зачем стринг??????

Если 8 бит передача то BYTE.....

Код

bool writed = WriteFile(hCom, mess, 1, &temp, &overlappedwr);

Автор: GreatShogun 13.8.2012, 13:20
лучше по одному байту слать? string для более удобного взаимодействия с интерфейсом.

Добавлено через 5 минут и 45 секунд
так то 9-бит просто я паритет пытался тут использовать) то есть девятый бит - бит четности

Автор: deniska 14.8.2012, 12:55
выставили режим с 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;

послали данные.

Автор: 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
не забыли сделать?

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

Код

    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;



Автор: 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 ).

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


ппс: по-моему такой финт связан с задержками в передаче данных виндой. то что мы вызвали 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 делал так:

Код

    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);


Автор: 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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)