Очень Срочно!!!!

  • Автор темы Fixxxer
  • Дата начала
Статус
Закрыто для дальнейших ответов.
F

Fixxxer

Гость
#1
Люди помогите. Написал прогу которая ститывает с com порта, а она вместо символов которые ей посылаешь, выдает какую-то абракадабру. Если есть у кого-нибудь готовый рабочий листинг чтения с порта, пожалуйста выложите его, а то сроки горят и я уже запарился с этим портами. Только пожалуйста не надо ссылок на документацию или типа того "поищи, эта тема уже поднималась". По этому вопросу уже весь инет излазил и ничего нет. Я пишу на С++ Builder. На всякий случай даю свой листинг, может чего подскажите:


DCB dcb;
COMMTIMEOUTS ct;
HANDLE port;
DWORD mask;
DWORD bc;
char buf[101];

dcb.DCBlength=sizeof(DCB);
BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dcB);
dcb.fNull=TRUE;

ct.ReadIntervalTimeout=10;
ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

SetCommState(port,&dcB);
SetCommTimeouts(port,&ct);
PurgeComm(port,PURGE_RXCLEAR);

SetCommMask(port,EV_RXCHAR);
WaitCommEvent(port,&mask,NULL);
ReadFile(port,buf,100,&bc,NULL);

CloseHandle(port);
 
F

Fixxxer

Гость
#2
Прошу прощения, форум какие то смайлики свтавил. Ещё раз только без смайлов:

DCB dcb;
COMMTIMEOUTS ct;
HANDLE port;
DWORD mask;
DWORD bc;
char buf[101];

dcb.DCBlength=sizeof(DC;
BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dc;
dcb.fNull=TRUE;

ct.ReadIntervalTimeout=10;
ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

SetCommState(port,&dc;
SetCommTimeouts(port,&ct);
PurgeComm(port,PURGE_RXCLEAR);

SetCommMask(port,EV_RXCHAR);
WaitCommEvent(port,&mask,NULL);
ReadFile(port,buf,100,&bc,NULL);

CloseHandle(port);
 
Z

zubr

Гость
#3
Fixxer
Извини, нет времени сейчас разбираться. недавно делал прогу по Dual-Up обмену данными, вот код, правда на Delphi:
Код:
procedure Init_port;
var
s:string;
dcb:_DCB;
cto:TCommTimeOuts;
begin
FHandle:= CreateFile(PChar(com_port), GENERIC_READ or GENERIC_WRITE,
     0, nil, OPEN_EXISTING,
     FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);
If FHandle=INVALID_HANDLE_VALUE then
begin
s:='ошибка при открытии порта '+com_port;
Application.MessageBox(PChar(s), 'TelBDServer',
 MB_OK+MB_ICONERROR+MB_TOPMOST);
exit;
end;
GetCommState(FHandle, dcb);
dcb.EvtChar:='~';
dcb.BaudRate:=speed_port;
dcb.ByteSize:=8;
dcb.Parity:=NOPARITY;
dcb.StopBits:=TWOSTOPBITS;
dcb.Flags:=(((((((((((((dcb.Flags and (not dcb_ParityCheck)) or dcb_OutxCtsFlow) and
(not dcb_OutxDsrFlow)) or dcb_DtrControlEnable) and
(not dcb_DtrControlHandshake)) and (not dcb_DsrSensivity)) or
dcb_TXContinueOnXoff) and (not dcb_OutX)) and (not dcb_InX)) and
(not dcb_ErrorChar)) and (not dcb_NullStrip)) or dcb_RtsControlEnable) and
(not dcb_RtsControlHandshake)) and (not dcb_AbortOnError);
SetCommState(FHandle, dcb);
GetCommTimeouts(FHandle, cto);
cto.ReadIntervalTimeout:=50;
cto.ReadTotalTimeoutMultiplier:=1;
cto.ReadTotalTimeoutConstant:=50;
cto.WriteTotalTimeoutMultiplier:=1;
cto.WriteTotalTimeoutConstant:=50;
SetCommTimeOuts(FHandle, cto);
SetupComm(FHandle, 1000, 1000);
PurgeComm(FHandle, PURGE_TXCLEAR);
PurgeComm(FHandle, PURGE_RXCLEAR);
EscapeCommFunction(FHandle, CLRDTR);
Sleep(10);
EscapeCommFunction(FHandle, SETRTS);
Sleep(100);
end;

procedure ReadFile;
var
nb:cardinal;
buf1:array[1..100] of char;
begin
ReadFile(FHandle, buf1, 100, nb, @sob_read);
GetOverlappedResult(FHandle, sob_read, nb, True);
PurgeComm(FHandle, PURGE_TXCLEAR);
PurgeComm(FHandle, PURGE_RXCLEAR);
EscapeCommFunction(FHandle, SETDTR);
end;
 
D

Dr.Gigabit

Гость
#4
ReadFile(port,buf,100,&bc,NULL);


Нужно так: ReadFile(port,&buf,100,&bc,NULL);

Ибо
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer, // указатель на буфер(!)
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);

Все остальное вроде правильно
 
F

Fixxxer

Гость
#5
Спасибо за ответы. Я кое что подправил, а именно:

DCB dcb;
COMMTIMEOUTS ct;
HANDLE port;
DWORD mask;
DWORD bc;
char buf[100]; //был 101

dcb.DCBlength=sizeof(DC;
BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dc;
dcb.fNull=TRUE;

ct.ReadIntervalTimeout=10;
ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

SetCommState(port,&dc;
SetCommTimeouts(port,&ct);
PurgeComm(port,PURGE_RXCLEAR);

SetCommMask(port,EV_RXCHAR);
WaitCommEvent(port,&mask,NULL);
ReadFile(port,&buf,100,&bc,NULL); // одинаковые значения с char buf[100]; ну и &buf поставил

CloseHandle(port);

теперь принимать стал лучше, но все равно добавляет символы.
Как сделать чтобы принимал 1:1 то что передают. Где касяк??
 
F

Fixxxer

Гость
#6
Всем большое спасибо. С предыдущими исправлениями все заработало.
 
D

Dico

Гость
#7
CComPort::CComPort(CString& sComPort)
{
m_sComPort = sComPort;
m_bPortReady = FALSE;
} // конец конструктора CComPort

CComPort::~CComPort()
{

} // конец деструктора CComPort

//
// инициализация COM порта
//
BOOL CComPort::Initialize()
{
DWORDdwRC;
DWORDdwError;
charsMsg[512];

m_bPortReady = TRUE; // всё OK

m_hCom = CreateFile(m_sComPort,
GENERIC_READ | GENERIC_WRITE,
0, // экслюзивно занимаем порт
NULL, // no security
OPEN_EXISTING,
0, // no overlapped I/O
NULL); // null template

if (m_hCom == INVALID_HANDLE_VALUE)
{
m_bPortReady = FALSE;
dwError = GetLastError();

// обработка ошибки
LPVOID lpMsgBuf;
lpMsgBuf = NULL;
dwRC = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwError, // из GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //
(LPTSTR) &lpMsgBuf,
0,
NULL);

if (dwRC && lpMsgBuf)
{
sprintf(sMsg, "COM open failed: Port=%s Error=%d - %s",
m_sComPort, dwError, lpMsgBuf);
AfxMessageBox(sMsg);
}
else
{
sprintf(sMsg, "COM open failed: Port=%s Error=%d ",
m_sComPort, dwError);
AfxMessageBox(sMsg);
} // end if
if (dwRC && lpMsgBuf)
{
LocalFree( lpMsgBuf );
} // end if

} // end if

if (m_bPortReady)
{
m_bPortReady = SetupComm(m_hCom,
128, 128); // размер буфера
if (!m_bPortReady)
{
dwError = GetLastError();
sprintf(sMsg, "SetupComm failed: Port=%s Error=%d",
m_sComPort, dwError);
AfxMessageBox(sMsg);

} // end if
} // end if

if (m_bPortReady)
{
m_bPortReady = GetCommState(m_hCom, &m_dcB);
if (!m_bPortReady)
{
dwError = GetLastError();
sprintf(sMsg, "GetCommState failed: Port=%s Error=%d",
m_sComPort, dwError);
AfxMessageBox(sMsg);
} // end if
} // end if

if (m_bPortReady)
{
m_dcb.BaudRate = 9600;
m_dcb.ByteSize = 8;
m_dcb.Parity = NOPARITY;
m_dcb.StopBits = ONESTOPBIT;
m_dcb.fAbortOnError = TRUE;

m_bPortReady = SetCommState(m_hCom, &m_dcB);
if (!m_bPortReady)
{
dwError = GetLastError();
sprintf(sMsg, "SetCommState failed: Port=%s Error = %d",
m_sComPort, dwError);
AfxMessageBox(sMsg);
}
} // end if

if (m_bPortReady)
{
m_bPortReady = GetCommTimeouts (m_hCom, &m_CommTimeouts);
if (!m_bPortReady)
{
dwError = GetLastError();
sprintf(sMsg, "GetCommTimeouts failed: Port=%s Error = %d",
m_sComPort, dwError);
AfxMessageBox(sMsg);
} // end if
} // end if

if (m_bPortReady)
{
m_CommTimeouts.ReadIntervalTimeout = 50;
m_CommTimeouts.ReadTotalTimeoutConstant = 50;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 10;
m_CommTimeouts.WriteTotalTimeoutConstant = 50;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 10;
m_bPortReady = SetCommTimeouts (m_hCom, &m_CommTimeouts);
if (!m_bPortReady)
{
dwError = GetLastError();
sprintf(sMsg, "SetCommTimeouts failed: Port=%s Error = %d",
m_sComPort, dwError);
AfxMessageBox(sMsg);
} // end if
} // end if

return m_bPortReady;
} // end CComPort::Initialize


//
// освобождаем COM порт
//
void CComPort::Terminate()
{
CloseHandle(m_hCom);
} /
 
Статус
Закрыто для дальнейших ответов.