Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Ответ:

Отправлено Xan 01 ноября 2009, г. 17:50
В ответ на: Поделись примерчиками, я пока что ничего более похожего на мою задачу, чем HT, не нашёл. отправлено пользователем ZoltriX 01 ноября 2009, г. 16:41

Забыл, как делать красивое форматирование :(


//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop

#include "CommPort.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)

BOOL CommWrite(void); // Write zero terminated string
long CommRead(void); // Nowait

extern char ReadFlag;
extern char WriteFlag;

extern char CommPortMes[80] = "-";
extern char CommResultMes[80] = "-";
extern char CommStatusMes[80] = "-";
extern char CommOpenFlag = 0;
extern char CommExitFlag = 0;
extern char CommOutBuffer[1030] = { 0, 'X', 4, 'A', 'b', 'c', 'd', 'E', 0};
extern char CommInBuffer[30000] = { 0x31, 0x42, 0x56, 0x03, 0, 0 };

extern long CommPortNum = 1;
extern long SoftOverCnt = 0;
extern long OverRunCnt = 0;
extern long ParityCnt = 0;
extern long FrameCnt = 0;
extern long BreakCnt = 0;
extern long ErrorCnt = 0;
extern long CSErrorCnt = 0;
extern long BlockErrorCnt = 0;
extern long BlockCnt = 0;
extern long CommInputBufferFlag = 0;
extern char Mes[80];

DCB dcb;
HANDLE hCom;
long dwError;
DWORD Errors;
BOOL fResult;
extern DWORD NumberOfBytesWritten = 0, NumberOfBytesRead = 0;
long CommTimeOuts[5];

long CS = 0;
long i = 0;
long j = 0;
long BlockLenth = 0;
long CommReadState = 0;
long TimeOutFlag = 0;
char InputByte;
char InputBuffer[100] = { 0 };

//---------------------------------------------------------------------------

BOOL CloseCommPort(void)
{
CloseHandle(hCom);
return(0);
}

//---------------------------------------------------------------------------

BOOL OpenCommPort(long CommNum, long BaudRate, char Parity)
{
CloseCommPort();
CommOpenFlag = 0;
sprintf(CommPortMes, "----");
sprintf(CommResultMes, "----");
sprintf(CommStatusMes, "----");
if (CommNum < 1 || CommNum > 8) return(FALSE);

sprintf(CommPortMes, "Com%u", CommNum);
hCom = CreateFile(CommPortMes, // pointer to name of the file
GENERIC_READ | GENERIC_WRITE, // access (read-write) mode
0, // share mode (exclusive access)
NULL, // pointer to security attributes (no)
OPEN_EXISTING, // how to create (must use OPEN_EXISTING)
0, // file attributes (not overlapped I/O)
NULL // hTemplate must be NULL for comm devices
);

if (hCom == INVALID_HANDLE_VALUE)
{
dwError = GetLastError();
sprintf(CommResultMes, "Cannot open");
return(FALSE);
}

sprintf(CommResultMes, "Ok");
CommPortNum = CommNum;

fResult = GetCommState(hCom, &dcb);

dcb.BaudRate = BaudRate;
dcb.ByteSize = 8;
if (Parity == 'o') dcb.Parity = ODDPARITY;
if (Parity == 'e') dcb.Parity = EVENPARITY;
if (Parity == 'n') dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;

dcb.fBinary = True; // binary mode, no EOF check
dcb.fParity = True; // enable parity checking
dcb.fOutxCtsFlow = False; // CTS output flow control
dcb.fOutxDsrFlow = False; // DSR output flow control
dcb.fDtrControl = DTR_CONTROL_DISABLE; // DTR flow control type
dcb.fDsrSensitivity = False; // DSR sensitivity

dcb.fTXContinueOnXoff = True; // XOFF continues Tx
dcb.fOutX = False; // XON/XOFF out flow control
dcb.fInX = False; // XON/XOFF in flow control
dcb.fErrorChar = False; // enable error replacement
dcb.fNull = False; // enable null stripping
dcb.fRtsControl = RTS_CONTROL_DISABLE; // RTS flow control
dcb.fAbortOnError = False; // abort reads/writes on

fResult = SetCommState(hCom, &dcb);

if (!fResult)
{
dwError = GetLastError();
sprintf(CommStatusMes, "StateError");
return(FALSE);
}
else
{
dwError = GetLastError();
sprintf(CommStatusMes, "Ok");
}

CommTimeOuts[0] = MAXDWORD; // ReadIntervalTimeout
CommTimeOuts[1] = 0; // ReadTotalTimeoutMultiplier
CommTimeOuts[2] = 0; // ReadTotalTimeoutConstant
CommTimeOuts[3] = 1; // WriteTotalTimeoutMultiplier
CommTimeOuts[4] = 1; // WriteTotalTimeoutConstant
fResult = SetCommTimeouts(hCom, (LPCOMMTIMEOUTS) CommTimeOuts);

if (!fResult)
{
dwError = GetLastError();
sprintf(CommStatusMes, "TimeOutError %x", dwError);
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), CommStatusMes, 390, NULL);
sprintf(CommStatusMes, "TimeOutError %x", dwError);
return(FALSE);
}
else
{
sprintf(CommStatusMes, "Ok %X %x %x %x %x", CommTimeOuts[0], CommTimeOuts[1],
CommTimeOuts[2], CommTimeOuts[3], CommTimeOuts[4]);
}

ClearCommError(hCom, &Errors, NULL);

CommOpenFlag = 1;
return(TRUE);
}

//---------------------------------------------------------------------------

BOOL CommWrite(void)
{
long i;

for (i=0; i<1024; i++)
{
if (CommOutBuffer[i] == 0) break;
}
if (i == 0) return(-1);

fResult = WriteFile(hCom, CommOutBuffer, i, &NumberOfBytesWritten, NULL);
return(fResult);
}

//---------------------------------------------------------------------------

long CommRead(void)
{
fResult = ReadFile(hCom, CommInBuffer, 4096, &NumberOfBytesRead, NULL);
ClearCommError(hCom, &Errors, NULL);
if (Errors)
{
if (Errors & CE_RXOVER) SoftOverCnt++;
if (Errors & CE_OVERRUN) OverRunCnt++;
if (Errors & CE_RXPARITY) ParityCnt++;
if (Errors & CE_FRAME) FrameCnt++;
if (Errors & CE_BREAK) BreakCnt++;
ErrorCnt++;
}
CommInBuffer[NumberOfBytesRead] = 0;
return NumberOfBytesRead;
}
//---------------------------------------------------------------------------


CommPort.h -- можно вычеркнуть, там повторение объявлений.

Мучайся!!! :)

Все подробности по CreatFile и другим функциям на сайте:
http://msdn2.microsoft.com/en-us/library/aa363858(VS.85).aspx


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 567:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru