Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > последовательный порт - неудачная попытка записи


Автор: sadafaga 1.9.2011, 09:19
не могу записать строку в порт, а
хочется что бы в "com1" порт писалась строка "ath/r/n", подскажите пожалуйста, где у меня ошибка

Код

#include "stdafx.h"
#include <windows.h>
#include <conio.h>

int main(int argc, char* argv[])
{
    char serialName[]     = "com1";
    char bufrd[] = "ath/r/n";
    HANDLE hPort;
    DWORD feedback;
    COMMTIMEOUTS commTimeouts;
    hPort = CreateFile(serialName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
    if(hPort!=INVALID_HANDLE_VALUE){
        COMMCONFIG comm;
        GetCommState(serialName, &comm.dcb);
        comm.dcb.BaudRate = 9600;
        comm.dcb.ByteSize = 8;
        comm.dcb.Parity = NOPARITY;
        comm.dcb.StopBits = ONESTOPBIT;
        if(SetCommState(hPort, &comm.dcb)!=0)
            if(PurgeComm(hPort, PURGE_RXCLEAR | PURGE_TXCLEAR)!=0)
                if(SetCommMask(hPort, EV_RXCHAR)!=0){
                    GetCommTimeouts(hPort, &commTimeouts);
                    commTimeouts.ReadIntervalTimeout = 100;
                    commTimeouts.ReadTotalTimeoutConstant = 300;
                    commTimeouts.ReadTotalTimeoutMultiplier = 50;
                    if(SetCommTimeouts(hPort,&commTimeouts))
                        if(WriteFile(hPort, &bufrd[0], 5, &feedback, 0) && feedback == 5)
                        {
                            printf("succeed write port");
                            CloseHandle(hPort);
                            getch();
                            return 0;
                        }
                }
    }
    CloseHandle(hPort);
    printf("failed write port");
    getch();
    return 0;
}

Автор: xvr 1.9.2011, 11:17
Во первых - если вы открываете порт в Overlepped режиме, то и писать в него нужно в Overlapped режиме (последний параметр в Write не может быть 0). В вашем случае Overlapped режим не нужен - уберите флаг FILE_FLAG_OVERLAPPED в CreateFile
Во вторых - в строке "ath/r/n" слэши должны быть обратные (если я правильно понял вашу задумку): "ath\r\n"

Автор: sadafaga 1.9.2011, 12:32
Уважаемый xvr, при много благодарен, помогло.

Автор: bass 1.9.2011, 14:18
Еще скорость ком порта не настолька вилека...... И устройство принемающее тоже может не блестать скоростью обработки.... Я бы писал по одному символу с некой задержкой(регулируемой)....  по байту.... так как приемник и предатчик имеют именно такой размер буфера....

Автор: xvr 1.9.2011, 20:47
Цитата(bass @  1.9.2011,  14:18 Найти цитируемый пост)
Еще скорость ком порта не настолька вилека...... И устройство принемающее тоже может не блестать скоростью обработки.... 

Что бы не успеть принять байт на скорости 9600 принимающий компьютер должен быть сделан на лампах  smile Или программист, писавший программу приема байтов на нем, должен обладать отменной степенью криворукости  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)