Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2012, 21:22   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию с Windows на Linux.

имеется код:
Код:
char S_COM19200[]="19200,n,8,1";//!<Comunnication format string setting 19200 bps, no parity, 8 databits, 1 stop bit   

HANDLE CCOMPort::OpenCOM(int COMi)   
{   
  DWORD dwError;   
  char strCOM[10]="COM1";   
  strCOM[3]+=(iCOM=COMi);   
  _SECURITY_ATTRIBUTES Security;   
  Security.bInheritHandle=true;   
  Security.lpSecurityDescriptor=NULL;   
  Security.nLength=sizeof(Security);   
  hCOMPort = CreateFile(strCOM, GENERIC_READ | GENERIC_WRITE,   
              0,NULL, OPEN_EXISTING,   
              FILE_ATTRIBUTE_NORMAL,   
              NULL);   
    if (hCOMPort == INVALID_HANDLE_VALUE)   
        dwError = GetLastError();   
    else dwError=0;   
  EnablePorts[COMi]=dwError;   
  return hCOMPort;   
   
}   

BOOL CCOMPort::InitCOM(int COMi, LPSTR Str,int iTimeOut=300)   
{   
   DCB dcb,dcb1;   
   COMMTIMEOUTS CommTimeOuts;   
   if(COMi<0) return FALSE;   
   if(EnablePorts[COMi])return FALSE;   
   PurgeComm(hCOMPort,-1);   
   CloseCOM();   
   SetupComm(OpenCOM(COMi),65535,0xffff);   
   GetCommState(hCOMPort, &dcb);   
   if(!BuildCommDCB(Str,&dcb1))return FALSE;   
 // Filling in the DCB   
      dcb.BaudRate = dcb1.BaudRate;   
      dcb.ByteSize = dcb1.ByteSize;   
      dcb.Parity = dcb1.Parity;   
      dcb.StopBits = dcb1.StopBits;    
      dcb.fBinary=1;          // binary mode, no EOF check   
      dcb.fParity=0;          // enable parity checking   
      dcb.fAbortOnError=FALSE; // abort reads/writes on error   
      dcb.fDtrControl=DTR_CONTROL_DISABLE;   
      dcb.fRtsControl=RTS_CONTROL_DISABLE;   
      dcb.fOutxCtsFlow=FALSE;   
      dcb.fOutxDsrFlow=FALSE;   
      dcb.fDsrSensitivity=FALSE;   
      dcb.fOutX=FALSE;   
 //---------------   
  if(!SetCommState(hCOMPort, &dcb))return FALSE;   
  CommTimeOuts.ReadTotalTimeoutConstant=iTimeOut;   
  CommTimeOuts.ReadTotalTimeoutMultiplier=11;   
  CommTimeOuts.WriteTotalTimeoutConstant=200;   
  CommTimeOuts.WriteTotalTimeoutMultiplier=11;   
  return SetCommTimeouts( hCOMPort, &CommTimeOuts ) ;   
   
 //------------------------   
}
переведя получаю следующее:
Код:
		Device(const char* name, unsigned speed, unsigned char _addr):addr(_addr)
		{
			#ifdef DEBUG
			std::cout<<"Device constructor: path="<<name<<" addr="<<(unsigned)_addr<<" speed="<<speed<<std::endl;
			#endif
			dev=open(name, O_RDWR | O_NOCTTY | O_NDELAY);
			if (dev==-1)
			{
				throw "Cannot open device.";
			}
			fcntl(dev, F_SETFL, FNDELAY);
			termios mode;
			tcgetattr(dev, &mode);
			cfsetispeed(&mode, speed);
			cfsetospeed(&mode, speed);
			mode.c_cflag&=~CSIZE;
			mode.c_cflag|=CS8;
			mode.c_cflag|=(CLOCAL|CREAD);
			mode.c_cflag&=~PARENB;
			mode.c_cflag&=~CSTOPB;
			mode.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);
			mode.c_oflag&=~OPOST;
			tcsetattr(dev, TCSANOW, &mode);
		}
однако, при попытке чтения в буфере пусто.
да и судя по всему до устройства данные тоже не доходят.

в чем я ошибся?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.05.2012, 23:04   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

что передаешь в качестве speed?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 01.05.2012, 23:07   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

константу B9600 или же B19200.

устройство принимает или 9600 или 19200(само проверяет скорость).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.05.2012, 12:55   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Дело в том, что порты под Линуксом имеют другое название.
Не "COM1" а "/dev/ttyS0", например...
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 02.05.2012, 14:39   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я знаю, путь передаю верный.
/dev/ttyS0

переформулирую вопрос, мне нужно открывать порт с параметрами:
Цитата:
Baud Rate: 9600 bps/19200 bps(не важно, но лучше большую наверно)
Start Bit: 1
Data Bit: 8(bit=LSB, bit 0 sent first)*
Parity: Parity none
Stop bit: 1
*чтото меня напрягло, а случаем не обратный порядок бит нужен?
надо попробовать.

устройство под виндой работает, а с линуха так и не вышло.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 02.05.2012 в 14:59.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.05.2012, 13:19   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в общем, так ничего и не вышло.
проверил, порядок бит и пакет формируется верно.
видимо чтото упустил в настройке порта, но что?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.05.2012, 13:25   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Пепел Феникса
ну проверяй, что возвращают функции cfsetispeed, cfsetospeed, tcsetattr.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 09.05.2012, 14:29   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

нули возвращают...даже уже не знаю куда думать...

так, под wine утилита пашет, но это не вариант.

а можно ли как то проверить с какими настройками открывает порт одна прога, а с какими другая?(все под линем, но одна через wine)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 09.05.2012 в 19:48.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.05.2012, 21:10   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

все отбой.
разобрался.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.05.2012, 22:43   #10
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

ну что было то
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Собираюсь перейти с Windows на Linux, какой из дистирибутивов наиболее похож на Windows (Xp,7)? ivan.tiran Windows 5 09.03.2012 17:51
с linux на windows nub' Операционные системы общие вопросы 12 19.01.2011 16:03
Windows и Linux Vikenty Свободное общение 11 01.10.2010 12:42
Linux vs. Windows Малый Програмист Операционные системы общие вопросы 10 06.11.2009 14:52
Linux на Windows XP iukash Операционные системы общие вопросы 10 03.09.2009 07:30