Как сделать последовательную связь в программе c? - PullRequest
0 голосов
/ 05 мая 2009

Использование компилятора vc ++, как можно получить доступ к последовательному порту. Функция Bioscom () может использоваться в Turbo C.

Ответы [ 4 ]

2 голосов
/ 05 мая 2009

Это много статей в Code Project, касающихся последовательной связи с C ++ . Это первая возвращенная статья . Вы в основном получаете доступ к порту с помощью операций ввода-вывода файлов. Это немного сложно, и я рекомендую найти подходящую библиотеку для этой задачи.

2 голосов
/ 05 мая 2009

вы должны открыть соответствующее com-устройство с помощью CreateFile примерно так. Адаптироваться к вашим потребностям.

// Handle of the communication connection 
void *comHandle;

// Port parameters, set to your own needs
unsigned portIndex;
unsigned baudRate;
unsigned dataBits;
Parity   parity;
unsigned stopBits;
bool     handShake;
int      readIntervalTimeout;
int      readTotalTimeoutMultiplier;
int      readTotalTimeoutConstant;
int      writeTotalTimeoutMultiplier;
int      writeTotalTimeoutConstant;
DCB dcb;
COMMTIMEOUTS ct;

// Create COM-device name string 
char comDevice[20];
sprintf(comDevice, "\\\\.\\COM%d", portIndex);

// Open serial port
_comHandle = CreateFile(comDevice, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (comHandle == INVALID_HANDLE_VALUE)
{
  return false;
}


ct.ReadIntervalTimeout         = readIntervalTimeout;        
ct.ReadTotalTimeoutMultiplier  = readTotalTimeoutMultiplier; 
ct.ReadTotalTimeoutConstant    = readTotalTimeoutConstant;   
ct.WriteTotalTimeoutMultiplier = writeTotalTimeoutMultiplier;
ct.WriteTotalTimeoutConstant   = writeTotalTimeoutConstant;  

if (!GetCommState(_comHandle,&dcb))
{
  disconnect();
  return false;
}

dcb.BaudRate        = baudRate;  
dcb.ByteSize        = (BYTE)dataBits;
dcb.Parity          = (parity == None) ? NOPARITY : ((parity == Even) ? EVENPARITY : ODDPARITY);
dcb.StopBits        = (stopBits > 1) ? TWOSTOPBITS : ONESTOPBIT;
dcb.fRtsControl     = handShake ? RTS_CONTROL_HANDSHAKE : RTS_CONTROL_ENABLE;
dcb.fOutxCtsFlow    = handShake;
dcb.fOutxDsrFlow    = handShake;
dcb.fDtrControl     = handShake ? DTR_CONTROL_HANDSHAKE : DTR_CONTROL_ENABLE;
dcb.fDsrSensitivity = handShake;
dcb.fOutX           = FALSE;
dcb.fInX            = FALSE;
dcb.fErrorChar      = FALSE;
dcb.fNull           = FALSE;
dcb.fAbortOnError   = TRUE;

// Set port state
if( !SetCommState(_omHandle, &dcb) ||
    !SetCommTimeouts(comHandle, &ct) ||
    !SetupComm(comHandle, 64, 64) ||
    !PurgeComm(comHandle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR))
{
  disconnect();
  return false;
} 

Прочитайте соответствующие записи MSDN для различных вызванных функций. Кроме того, для краткости я пропустил метод отключения.

1 голос
/ 05 мая 2009

На этой странице в Microsoft Developer Network рассказывается, как работать с последовательными портами в Windows, и я предполагаю, что это среда, на которую вы хотите ориентироваться, исходя из вашего выбора компилятора.

0 голосов
/ 05 мая 2009

Функции BIOS доступны только в том случае, если вы используете MSDOS или очень старые версии Windows (и относятся только к Turbo C). В современных версиях Windows вам потребуется использовать API-интерфейсы ОС для выполнения последовательного ввода-вывода.

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