Последовательная связь между C и Arduino Uno работает неправильно - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь отправить данные с потенциометра в программу на C, работающую на моем ПК с Windows 10, через Arduino Uno (для отправки данных) и Windows API (для чтения данных с USB-последовательного порта).Программа на C не обнаруживает строку, которую посылает Arduino, и следующая отправленная строка приводит к повреждению первой.

Кажется, что у монитора Arduino Serial нет этих проблем, так что это должна быть программа на C, верно?Программа на C представляет собой слегка отредактированную версию этого урока by xanthium .

    //create file
    HANDLE hComm;
    char ComPortName[] = "\\\\.\\COM3";
    hComm = CreateFile(ComPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if(hComm == INVALID_HANDLE_VALUE)
    {
        printf("Error! Port %s can't be opened.\n", ComPortName);
        return 1;
    }
    printf("Port opened.\n");

    //port parameters
    dcbSerialParams.BaudRate = 9600;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = 1;
    dcbSerialParams.Parity = 0;

    //timeouts
    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 50;
    timeouts.ReadTotalTimeoutMultiplier = 10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier = 10;

    //comm mask
    Status = SetCommMask(hComm, EV_RXCHAR);
    if(Status == FALSE)
    {
        printf("Error in setting CommMask.\n");
        return 1;
    }

    //reception
    printf("Waiting for data reception...\n\n");
    Status = WaitCommEvent(hComm, &dwEventMask, NULL);
    if(Status == FALSE)
    {
        printf("Error in setting WaitCommEvent()\n");
        return 1;
    }
    printf("Characters received!\n");

    //read file
    do
    {
        Status = ReadFile(hComm, &TempChar, sizeof(TempChar), &NoBytesRead, NULL);
        SerialBuffer[i] = TempChar;
        i++;
    }
    while(NoBytesRead > 0);

    //print data
    for(int j = 0; j < i-1; j++) printf("%c", SerialBuffer[j]);
    printf("\n\n");

    //close comm
    CloseHandle(hComm);
    system("pause");
    return 0;
}

Программа работает отлично, Arduino Uno сбрасывается при открытии последовательного порта, Arduino отправляет строку и ... ничего.Программа останавливается на

Status = WaitCommEvent(hComm, &dwEventMask, NULL);

Строка не обнаружена.Однако, если строка отправляется снова, следующая отправленная строка повреждает первую строку.

Arduino будет отправлять 638, но программа C не зарегистрирует ее, тогда другая 638 и программа C будутзарегистрируйте его как 63638 или ��638.

...