реклама на сайте
подробности

 
 
> RS232 и передача 0, не получаеться передать 0
kolisnichenko_r
сообщение Jul 12 2010, 12:16
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482



Здравствуйте!
Использую для работы с СОМ портом потоки WINAPI и функции ResumeThread(), SuspendThread(). За основу взята программа с сайта http://www.piclist.ru/S-COM-THREAD-RUS/S-COM-THREAD-RUS.html. Разные значения отсылаются, но если есть где-то в посылке нолевое значение - отправка прерывается. Как можно передать 0? Дайте совет, пожалуйста.
Код передачи:
Код
//peredacha - 10 byte
   memset(bufwr,0,BUFSIZE);            //очистить программный передающий буфер, чтобы данные не накладывались друг на друга
   PurgeComm(COMport, PURGE_TXCLEAR);           //очистить передающий буфер порта
   for(unsigned char icd=0;icd<10;icd++){bufwr[icd]=comand[icd];}
   ResumeThread(writer);               //активировать поток записи данных в порт
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Jul 12 2010, 12:21
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Попробуйте поиграться с флажком fnull структуры DCB
Помнится, были с ним проблемы, правда, при приёме


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
kolisnichenko_r
сообщение Jul 12 2010, 13:16
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482



Цитата(MrYuran @ Jul 12 2010, 15:21) *
Попробуйте поиграться с флажком fnull структуры DCB
Помнится, были с ним проблемы, правда, при приёме

Разрешение на прием 0 есть:
Код
dcb.fNull = FALSE;//разрешить приём нулевых байтов

Может где-то тут покопаться:
Код
reader = CreateThread(NULL, 0, ReadThread, NULL, 0, NULL);//создаём поток чтения, который сразу начнёт выполняться (предпоследний параметр = 0)
writer = CreateThread(NULL, 0, WriteThread, NULL, CREATE_SUSPENDED, NULL);//создаём поток записи в остановленном состоянии (предпоследний параметр = CREATE_SUSPENDED)


Нашел:
Код
//главная функция потока, выполняет передачу байтов из буфера в COM-порт
DWORD WINAPI WriteThread(LPVOID)
{DWORD temp, signal;    //temp - переменная-заглушка
overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);         //создать событие
while(1)
  {WriteFile(COMport, bufwr, strlen(bufwr), &temp, &overlappedwr);  //записать байты в порт (перекрываемая операция!)
    signal = WaitForSingleObject(overlappedwr.hEvent, INFINITE);      //приостановить поток, пока не завершится перекрываемая операция WriteFile
   if((signal == WAIT_OBJECT_0) && (GetOverlappedResult(COMport, &overlappedwr, &temp, true)))    //если операция завершилась успешно
     {
      Form1->StatusBar1->Panels->Items[0]->Text  = "Передача прошла успешно";    //вывести сообщение об этом в строке состояния
     }
   else {Form1->StatusBar1->Panels->Items[0]->Text  = "Ошибка передачи";}     //иначе вывести в строке состояния сообщение об ошибке
   SuspendThread(writer);
  }
}

В этой функции используеться функция
Код
WriteFile(COMport, bufwr, strlen(bufwr), &temp, &overlappedwr);  //записать байты в порт (перекрываемая операция!)

А в ней для определения длины посылки используеться функция strlen(bufwr). Заменил эту функцию явным количеством символов посылки, все заработало.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 11:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016