Tue. Jul 1st, 2025
#include <windows.h>
#include <stdio.h>
#include <string.h>

bool OpenSendCheck(const char* portName, const char* sendCmd, const char* expectedResp, DWORD baudRate = CBR_9600) {
    HANDLE hSerial = CreateFileA(portName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
    if (hSerial == INVALID_HANDLE_VALUE) {
        printf("Failed to open port %s\n", portName);
        return false;
    }

    // Set serial parameters
    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams)) { CloseHandle(hSerial); return false; }
    dcbSerialParams.BaudRate = baudRate;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;
    if (!SetCommState(hSerial, &dcbSerialParams)) { CloseHandle(hSerial); return false; }

    // Set timeouts
    COMMTIMEOUTS timeouts = {0};
    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 200;
    timeouts.ReadTotalTimeoutMultiplier = 10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier = 10;
    SetCommTimeouts(hSerial, &timeouts);

    // Prepare command with CR LF
    char sendBuffer[128];
    snprintf(sendBuffer, sizeof(sendBuffer), "%s\r\n", sendCmd);

    // Send command
    DWORD bytesWritten;
    if (!WriteFile(hSerial, sendBuffer, strlen(sendBuffer), &bytesWritten, NULL)) {
        CloseHandle(hSerial);
        return false;
    }

    // Wait and read response
    char buffer[256] = {0};
    DWORD bytesRead;
    if (!ReadFile(hSerial, buffer, sizeof(buffer)-1, &bytesRead, NULL)) {
        CloseHandle(hSerial);
        return false;
    }
    buffer[bytesRead] = '\0'; // Null-terminate

    CloseHandle(hSerial);

    // Check response
    return (strstr(buffer, expectedResp) != NULL);
}

// Example usage:
int main() {
    if (OpenSendCheck("\\\\.\\COM3", "HELLO", "MYDEVICE_OK")) {
        printf("Device found!\n");
    } else {
        printf("Device not found.\n");
    }
}

#include <windows.h>
#include <stdio.h>
#include <string.h>
// Assume OpenSendCheck is defined as before
const char* FindMyDevicePort(const char* sendCmd, const char* expectedResp, DWORD baudRate = CBR_9600) {
    static char foundPort[16] = "";
    for (int i = 1; i <= 255; ++i) {
        char portName[20];
        snprintf(portName, sizeof(portName), "\\\\.\\COM%d", i);
        if (OpenSendCheck(portName, sendCmd, expectedResp, baudRate)) {
            strncpy(foundPort, portName, sizeof(foundPort));
            return foundPort;
        }
    }
    return NULL;
}
// Example usage:
int main() {
    const char* port = FindMyDevicePort("HELLO", "MYDEVICE_OK");
    if (port) {
        printf("Device found on port: %s\n", port);
    } else {
        printf("Device not found.\n");
    }
    return 0;
}
const char* FindZaberPort() {
    const char* sendCmd = "/1 get id";
    const char* expectedResp = "OK ID";
    DWORD baudRate = 115200;
    return FindMyDevicePort(sendCmd, expectedResp, baudRate);
}

By ivan

Leave a Reply

Your email address will not be published. Required fields are marked *