Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Ovladání přes port ttyS0 [VYŘEŠENO]  (Přečteno 1613 krát)

Cendas

Ovladání přes port ttyS0 [VYŘEŠENO]
« kdy: 28 Prosince 2014, 09:09:16 »
Ahoj potřeboval bych napsat program pro otevření supliku který vyšle signál na jeden pin a počká na odpověď která přijde po druhém pinu. Napsal jsem to kdysi pro windows a teď bych to potřeboval pod Linuxem.
Tady je výpis toho programu pro windows .
Kód: [Vybrat]
//PortCom.h
#ifndef header_PortCom
#define header_PortCom

#include <windows.h>
#include <mmsystem.h>
#include <iostream>
#include <stdio.h>
#include <ctime>
//--------------------------------------------------------------------------//
bool OpenCom(int CisloComu);
void CloseCom(void);
void Wait_us(unsigned __int64 prodleva);
void CloseI2C(void);
void SetDTR(bool x);
void SetRTS(bool x);
void SetTX(bool x);
bool GetCTS(void);
bool GetDSR(void);
bool GetRing(void);
bool GetRLSD(void);
void Wait_us(unsigned __int64 prodleva);
void Wait_s(int prodleva);

#endif
Kód: [Vybrat]
#include "PortCom.h"

int main(int argc, char* argv[])
{
OpenCom(1);
std::cout << "Otviram suplik.";
SetTX(true);
while(GetCTS() == false);
SetTX(false);
  std::cout << "\a\rOK koncim.";
  Wait_s(1);
return 0;
}
Tohle se mi podařilo sesmolit pro linux ale nemůžu přijít na to jak vyslat signál na určitý pin konektoru.
Kód: [Vybrat]
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

#define SERPORT "/dev/ttyS0"
//---------------------------------------------------------------------------
int fd;
int status;

int main(int argc, char **argv)
{
fd = open(SERPORT, O_RDWR);
printf ("Otviram suplik.\n");
do{
ioctl(fd, TIOCMGET, &status); /* Nacte stav */
status |= TIOCM_ST; //pin 2 ST
ioctl(fd, TIOCMSET, &status); /* Nastavi bit */
ioctl(fd, TIOCMGET, &status); /* Nacte stav */
status |= TIOCM_CTS; //pin 8 ST
}while((status &TIOCM_CTS) != 0);//Stoji dokud je 0
ioctl(fd, TIOCMGET, &status); /* Nacte stav */
status |= TIOCM_ST; //pin 2 ST
ioctl(fd, TIOCMBIC, & status); /* Vynuluje bit */
printf ("OK koncim.\n");
close(fd);
return 0;
}
« Poslední změna: 30 Prosince 2014, 14:46:27 od Cendas »

Myrmica

  • Závislák
  • ***
  • Příspěvků: 1701
    • MYRMICA
Re:Ovladání přes port ttyS0
« Odpověď #1 kdy: 29 Prosince 2014, 09:36:43 »
Přijde mi poněkud nešťastné používat k ovládání čehokoli signály na pinech sériového portu. Ještě nešťastnější používat k tomuto ovládání TX. Snadněji se ovládají signály DTR a RTS.
Problém bývá v tom, že mnohé porty tuto manipulaci nepodporují (zejména jedná-li se o převodníky USB to SERIAL a podobně)

Mrkni sem třeba ti to pomůže: http://www.teuniz.net/RS-232/
Stolní strojek: OS– UBUNTU 16.04 x86_64, MB ASUS P8 Z68-V/GEN3, Intel® Core™ i5-3470 CPU @ 3.20GHz × 4 , 16GiB DDR3, GeForce GTX 670...
Notebook: ASUS U53Jc OS– UBUNTU 16.04 x86_64, Windows 7, Processor – Intel Core i5-460M (2,53 GHz), Graphics – switchable NVIDIA GeForce 310M and Intel GMA HD

Cendas

Re:Ovladání přes port ttyS0
« Odpověď #2 kdy: 30 Prosince 2014, 14:45:36 »
Ahoj už jsem to vyřešil použil jsem k tomu DTR a RTS .
V každém případě dík za zajímaví odkaz.

 

Provoz zaštiťuje spolek OpenAlt.