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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программирование интерфейса RS232 
:(
    Опции темы
Fixin
Дата 2.9.2006, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Цитата(Gremlin @  31.8.2006,  17:53 Найти цитируемый пост)
как решить данный трабл!
ну это уже офтоповый трабл - это раз, и в чем проблема-то - это два.
имхо, квадратик после циферки в дебаггере - это отображения символа из таблицы ASCII по номеру, в данном случае, 8 - неотображаемый символ, вот и видишь ты квадратик пустой.

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


Шустрый
*


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

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



Как мне послать устройству команды описанные выше например TS
Код

if (!SetCommMask(hPort, EV_RXCHAR)) 
         MessageBox("Error setting port mask");

    DWORD dwWrite;
    OVERLAPPED OverWrite;
    BYTE WriteBytes[2] = "TS"; 
    OverWrite.hEvent = CreateEvent(NULL, true, false, NULL);
    if (OverWrite.hEvent == NULL)
        MessageBox("Error creating write event");
    if (!WriteFile(hPort, WriteBytes, sizeof(WriteBytes), &dwWrite, &OverWrite) && (GetLastError() != ERROR_IO_PENDING))
                              MessageBox("Error writing port"); 

 BYTE WriteBytes[2] = "TS"; --- вот здесь как записать команду



Это сообщение отредактировал(а) Gremlin - 3.9.2006, 12:45
PM MAIL   Вверх
GremlinProg
Дата 3.9.2006, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



показал ведь уже:
Код

double epsilon = 4.26E+0;
CHAR WriteBytes[1024]; 
sprintf(WriteBytes,"TS%.2e\n",epsilon);

после выполнения sprintf, в массиве WriteBytes будет содержаться команда TS4.26E+0<CR>
Здесь epsilon выставили в 4.26E+0, но если её поменяешь, соответственно поменяется и команда в массиве WriteBytes

отправляешь WriteBytes так:
Код

WriteFile(hPort, WriteBytes, strlen(WriteBytes), &dwWrite, &OverWrite)



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gremlin
Дата 3.9.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ок тока чото я не понимаю запись TS%.2e\n и разве не нужно <cr>? 
PM MAIL   Вверх
GremlinProg
Дата 3.9.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



\n - это и есть <cr>, в принципе, исходя из информации, которую ты тут выложил, можно использовать любой из четырех вариантов завершения команды: \n , \r, \r\n, \n\r, я выбрал первый.
%.2e - строка, форматирующая вещественное число в такой вот, экспоненциальный вид: x.xxE+x


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gremlin
Дата 3.9.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Аааа понятно!! Вот ешо! Я открываю ком порт у него есть такие свойства как parity, bitssize, stopbits какие значения мне необходимо выставить ибо в мануале только сказано что baudrate = 9600, а остальное не сказано smile
PM MAIL   Вверх
GremlinProg
Дата 3.9.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



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

  Dcb.Parity    = NOPARITY;
  Dcb.ByteSize  = 8;
  Dcb.StopBits  = ONESTOPBIT;

но для большей надежности, я заполняю Dcb исходя из текущего состояния порта, т.е. пееред тем как выставлять Parity, ByteSize..., вызови GetCommState(port,Dcb). Это установит флаги Dcb так, как они были установлены при последнем обращении к порту.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gremlin
Дата 4.9.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сделал так
Код

// --- Перевод в режим прием данных ---
    if (!SetCommMask(hPort, EV_RXCHAR)) 
         MessageBox("Error setting port mask");
    //--- посылка----
    double epsilon = 4.26E+0;
    CHAR WriteBytes[1024]; 
    sprintf(WriteBytes,"TS%.2e\n",epsilon);
    DWORD dwWrite;
    OVERLAPPED OverWrite;
    
    OverWrite.hEvent = CreateEvent(NULL, true, false, NULL);
    if (OverWrite.hEvent == NULL)
        MessageBox("Error creating write event");
    if (!WriteFile(hPort, WriteBytes, sizeof(WriteBytes), &dwWrite, &OverWrite) && (GetLastError() == ERROR_IO_PENDING))
                              MessageBox("Error writing port"); 
    //--- ответ ---
    COMSTAT ComStat;
    DWORD dwMask, dwError;
    OVERLAPPED OverRead;
    CHAR Buf[1024];                         
    DWORD dwRead; 
    OverRead.hEvent = CreateEvent(NULL, true, false, NULL);
    if (OverRead.hEvent == NULL) 
        MessageBox("Error creating read event");

        
    if  (!WaitCommEvent(hPort, &dwMask, &OverRead)) 
    {
        if (GetLastError() == ERROR_IO_PENDING)
            WaitForSingleObject(OverRead.hEvent, INFINITE); 
        else 
            MessageBox("Error waiting port event");
        
    }
    if (!ClearCommError(hPort, &dwError, &ComStat))
           MessageBox("Error clearing port"); 
    
    dwRead = ComStat.cbInQue; 
    if (dwRead > 0) 
    {
        if (!ReadFile(hPort, Buf, dwRead, &dwRead, &OverRead)) 
             MessageBox("Error reading port");
    }

На месте WaitForSingleObject(OverRead.hEvent, INFINITE); он уходит в раздумья типа ничего с прибора не получает ответа даже опшибки smile


Это сообщение отредактировал(а) Gremlin - 4.9.2006, 12:42
PM MAIL   Вверх
GremlinProg
Дата 4.9.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Gremlin @  4.9.2006,  14:40 Найти цитируемый пост)
На месте WaitForSingleObject(OverRead.hEvent, INFINITE); он уходит в раздумья типа ничего с прибора не получает ответа даже опшибки 

перед тем, как отправлять в порт свои команды, пошли в него просто 1-2 байта для синхронизации, например таких: "\0\n". Это, скорее всего, решит проблему.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gremlin
Дата 5.9.2006, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ой а мне сказали нужно разделить потоки Thread для чтения тока не сказали как! И кстати у меня не получается послать команду т.е. прибор не реагирует на команду smile
PM MAIL   Вверх
GremlinProg
Дата 5.9.2006, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



всю прверку WaitCommEvent нужно положить в "бесконечный" цикл, а цикл - в отдельный поток. Любое чтение байт из порта нужно каждый раз сбрасывать в отдельный буфер (организовать очередь), а после добавления новых байт в эту очередь - выполнять, нужную тебе, процедуру обработки буфера. Перед работой потока желательно синхронизировать I/O порта с I/O машины (см. предыдущий пост), иначе будешь практически всегда терять, по крайней мере, первый байт как на прием, так и на передачу(возможно из за рассинхронизации команда и не принимается устройством).

Все это нужно делать в идеальном случае.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gremlin
Дата 8.9.2006, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ошибка первая была в том что нужно инициализировать  OVERLAPPED OverRead ={0}; и теперь я нормально посылаю команды Read еще не пробовал но если можно то мне бы сэмпл по поводу создания отдельного потока
PM MAIL   Вверх
GremlinProg
Дата 8.9.2006, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



по идее, OverRead и OverWrite должны быть инициализированы в ноль перед использованием
Цитата(MSDN)

This structure should always be initialized to zero before it is used in a function call. If it is not, the function may fail and return ERROR_INVALID_PARAMETER.


Добавлено @ 07:14 
http://msdn.microsoft.com/library/default....reatethread.asp
http://msdn.microsoft.com/library/default....ginthreadex.asp


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gremlin
Дата 13.9.2006, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сходил по ссылке данной в начале топика http://www.izone.kiev.ua/articles/delphi/16/282.htm там пример но в делфи тама написано так:

"Рассмотрение работы с потоками в Windows, в частности того, как это реализовано в Delphi, выходит за рамки данной статьи. Предполагаю, что читатель встречался или по крайней мере знаком с этим. Скажу лишь, что у любого потока есть главная функция, которая начинает выполняться после его создания. В Delphi для потоков существует класс TThread, а его главная процедура называется TThread.Execute(). 

Вот так выглядит главная процедура отдельного потока, которая ожидает появление одного или нескольких символов и считывает их:

Код

procedure TReadThread.Execute;
var ComStat: TComStat; 
dwMask, dwError: DWORD; 
OverRead: TOverlapped; 
Buf: array[0..$FF] of Byte; 
dwRead: DWORD;
begin OverRead.hEvent := CreateEvent(nil, True, False, nil); 
if OverRead.hEvent = Null then  raise Exception.Create('Error creating read event'); 
FreeOnTerminate := True;  
while not Terminated do begin   
if not WaitCommEvent(hPort, dwMask, @OverRead) 
then   begin    
if GetLastError = ERROR_IO_PENDING 
then      WaitForSingleObject(OverRead.hEvent, INFINITE)    
else      raise Exception.Create('Error waiting port event');   
end;   
if not ClearCommError(hPort, dwError, @ComStat) 
then     raise Exception.Create('Error clearing port');   
dwRead := ComStat.cbInQue;  
 if dwRead > 0 then   begin     
if not ReadFile(hPort, Buf, dwRead, dwRead, @OverRead)
 then       raise Exception.Create('Error reading port');     
// В Buf находятся прочитанные байты     
// Далее идет обработка принятых байтов   
end;
end; 
{while}end; 


В приведенном примере в потоке крутится цикл, тем самым инициируется ожидание события порта вызовом функции WaitCommEvent(), ожидание же самого этого события задается функцией WaitForSingleObject(). Для определения количества принятых символов используется функция ClearCommError(). Когда количество принятых символов (dwRead) известно, непосредственное чтение символов выполняется функцией ReadFile(). "

Как это реализовать в Си? не могу найти какой функцией в Си пользоваться вместо TReadThread.Execute помогите плз!

PM MAIL   Вверх
GremlinProg
Дата 13.9.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Сходи по ссылкам предыдущего поста. 2 ссылки - 2 решения, выбирай любое, какое нравится. Примеры там же, но для первой ищи For an example, see... в конце страницы.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1229 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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