проблемка...(послед. порт)
От: teran2000  
Дата: 18.09.07 05:47
Оценка:
есть некое устройство., с ним общаться можно только через послед. порт.

устройство понимает только такое(сигнал от компа к девайсу): 8бит, NOPARITY,TWOSTOPBIT
а отвечает таким(от девайса к компу):8бит, NOPARITY,ONESTOPBIT

причем линии RX TX общие!
т.е. когда шлю в девайс данные одновременно эти же данные идут обратно,
ну и через некоторое время девайс отвечает.

Сначала я не заметил и просто выставил 8бит, NOPARITY,TWOSTOPBIT, и все заработало...
Но когда комманд стало больше...мое приложение стало виснуть в неопределенных местах.
Пока нашел эту нестыковочку со стоповыми битами..всю прогу перепроверил.

теперь не знаю как такую работу организовать, не получается переключать ONESTOPBIT/TWOSTOPBIT

по понятным причинам 1,5 стопбита на 8бит данных не ставится.

//отправка данных в девайс
BOOL CSerialPort::send_cmd(BYTE* buff, DWORD cnt)
{       DWORD tc;
    BYTE rets[sizeof(buff)]; 
    WriteFile(m_PortHandle, buff, cnt, &tc, NULL);
    ReadFile(m_PortHandle, rets, cnt, &tc, NULL);
    if(tc != cnt) 
    return FALSE;
    if(memcmp(buff, rets, cnt)) return FALSE;
    else
    return TRUE;
}

//прием данных из девайса
BYTE CSerialPort::rcvr_respUNI(int num)
{   
    DWORD cnt;
    BYTE rv[10];
    ReadFile(m_PortHandle, rv, num, &cnt, NULL);
    return rv[2];
}



пытался переключать ONESTOPBIT/TWOSTOPBIT, не получается...:

BOOL CSerialPort::oneSTOP()
{    
        DCB dcb;
    GetCommState(m_PortHandle, &dcb);
    dcb.StopBits = ONESTOPBIT;     
        SetCommState(m_PortHandle, &dcb);
return TRUE;
}

BOOL CSerialPort::twoSTOP()
{
        DCB dcb;
    GetCommState(m_PortHandle, &dcb);
    dcb.StopBits =2;     
        SetCommState(m_PortHandle, &dcb);
return TRUE;
}
Re: проблемка...(послед. порт)
От: wallaby  
Дата: 18.09.07 06:28
Оценка: 3 (1) +1
Здравствуйте, teran2000, Вы писали:

T>есть некое устройство., с ним общаться можно только через послед. порт.


T>устройство понимает только такое(сигнал от компа к девайсу): 8бит, NOPARITY,TWOSTOPBIT

T>а отвечает таким(от девайса к компу):8бит, NOPARITY,ONESTOPBIT

Интересное устройство. А если распаять кабель на два порта компа и с одного читать, а в другой писать?
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re[2]: проблемка...(послед. порт)
От: teran2000  
Дата: 18.09.07 06:39
Оценка:
это устройство японское...точнее это микроконтроллер nec.
чем японцы руководствовались изобретая такое...объяснить не могу

т.е. вы хотите сказать что технически работа одного порта для такой задачи невозможна?
Re[3]: проблемка...(послед. порт)
От: wallaby  
Дата: 18.09.07 07:36
Оценка: 3 (1)
Здравствуйте, teran2000, Вы писали:.

T>это устройство японское...точнее это микроконтроллер nec.

T>чем японцы руководствовались изобретая такое...объяснить не могу

T>т.е. вы хотите сказать что технически работа одного порта для такой задачи невозможна?


Самым правильным будет изготовить какое-то согласующее устройство. Или попробовать программно эмулировать стоповый бит при записи в порт, посылая в него по байту.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re: проблемка...(послед. порт)
От: ДимДимыч Украина http://klug.org.ua
Дата: 18.09.07 07:58
Оценка:
Здравствуйте, teran2000, Вы писали:

T>устройство понимает только такое(сигнал от компа к девайсу): 8бит, NOPARITY,TWOSTOPBIT

T>а отвечает таким(от девайса к компу):8бит, NOPARITY,ONESTOPBIT

ИМХО наиболее правильным было бы сделать "аппаратный прокси" на основе одного МК с двумя USART (например ATmega64, ок. $5) или двух МК с одним USART (например ATtiny2313, $1.5).
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: проблемка...(послед. порт)
От: teran2000  
Дата: 18.09.07 09:21
Оценка:
W>Самым правильным будет изготовить какое-то согласующее устройство. Или попробовать программно эмулировать стоповый бит при записи в порт, посылая в него по байту.

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

интересный вариант с эмуляцией.
это как?

по идеи можно заставить DTR или RTS работать как TX но как это сделать в винде..не представляю..
Re[5]: проблемка...(послед. порт)
От: ДимДимыч Украина http://klug.org.ua
Дата: 18.09.07 10:34
Оценка:
Здравствуйте, teran2000, Вы писали:

T>по идеи можно заставить DTR или RTS работать как TX но как это сделать в винде..не представляю..


Посмотрите как работает WinLIRC. Там частоты конечно пониже, но принцип может пригодиться.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[5]: проблемка...(послед. порт)
От: wallaby  
Дата: 18.09.07 10:35
Оценка:
Здравствуйте, teran2000, Вы писали:

T>интересный вариант с эмуляцией.

T>это как?

Я имел в виду заставить порт посылать в линию данные по байту так, чтобы промежуток между посылкой байтов заведомо превышал 2 (стоповых) бита. Тогда будет неважно, что порт настроен на 1 стоповый бит. Сам не пробовал.

T>по идеи можно заставить DTR или RTS работать как TX но как это сделать в винде..не представляю..


Я сомневаюсь что это заработает (Windows не позволяет точно задавать промежутки времени) но вообще-то есть функция EscapeCommFunction, позволяющая управлять линиями DTR и RTS. Для этого управление этими линиями должно быть разрешено в поле Flags структуры DCB (DTR_CONTROL_ENABLE, RTS_CONTROL_ENABLE). Про EscapeCommFunction должно быть здесь или на MSDN здесь
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re[6]: проблемка...(послед. порт)
От: teran2000  
Дата: 18.09.07 12:00
Оценка:
W>Я имел в виду заставить порт посылать в линию данные по байту так, чтобы промежуток между посылкой байтов заведомо превышал 2 (стоповых) бита. Тогда будет неважно, что порт настроен на 1 стоповый бит. Сам не пробовал.

хм...идея! у меня все отправляется с минимальным промежутком между байтами
попробую поставить задержку между байтами

спасибо!
Re[7]: проблемка...(послед. порт)
От: teran2000  
Дата: 18.09.07 16:02
Оценка:
Здравствуйте, teran2000, Вы писали:

W>>Я имел в виду заставить порт посылать в линию данные по байту так, чтобы промежуток между посылкой байтов заведомо превышал 2 (стоповых) бита. Тогда будет неважно, что порт настроен на 1 стоповый бит. Сам не пробовал.


T>хм...идея! у меня все отправляется с минимальным промежутком между байтами

T>попробую поставить задержку между байтами

T>спасибо!


все получилось! спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.