2016-01-03 2 views
1

Я пытаюсь установить интерфейс UART между внешним микроконтроллером и Windows, используя C.UART с использованием C в Windows,

Я использую следующий код для настройки параметров UART, а затем отправить в символе, назначенный COM-порт.

Успешная передача персонажа. Но как мне получить обратно? Код выглядит следующим образом:

#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 
#include <math.h> 
#include <string.h> 

HANDLE hSerial; 
int main() 
{ 
// OPEN SERIAL PORT AND SET INITAL UART PARAMETERS 
//================================================= 
DCB dcbSerialParams = {0}; COMMTIMEOUTS timeouts = {0}; 
fprintf(stderr, "Opening serial port..."); 
hSerial = CreateFile("\\\\.\\COM3", GENERIC_READ|GENERIC_WRITE, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

if (hSerial == INVALID_HANDLE_VALUE){fprintf(stderr, "Error\n");return 1;} 
else {fprintf(stderr, "OK\n");} 

// Set device parameters (115200 baud, 1 start bit, 1 stop bit, no parity) 
dcbSerialParams.DCBlength = sizeof(dcbSerialParams); 
if (GetCommState(hSerial, &dcbSerialParams) == 0){fprintf(stderr, "Error getting device state\n");CloseHandle(hSerial);return 1;} 

dcbSerialParams.BaudRate = CBR_57600; dcbSerialParams.ByteSize = 8; dcbSerialParams.StopBits = ONESTOPBIT; dcbSerialParams.Parity = NOPARITY; 

if(SetCommState(hSerial, &dcbSerialParams) == 0){fprintf(stderr, "Error setting device parameters\n");CloseHandle(hSerial);return 1;} 

// Set COM port timeout settings 
timeouts.ReadIntervalTimeout = 50; timeouts.ReadTotalTimeoutConstant = 50; timeouts.ReadTotalTimeoutMultiplier = 10; 
timeouts.WriteTotalTimeoutConstant = 50; timeouts.WriteTotalTimeoutMultiplier = 10; 

if(SetCommTimeouts(hSerial, &timeouts) == 0){fprintf(stderr, "Error setting timeouts\n"); CloseHandle(hSerial); return 1;} 



// SETUP AND SEND DATA FROM UART 
//============================== 
    int VarNum=8; 
    char str[15]; 
    sprintf(str,"%ld",VarNum); 


    DWORD bytes_written, total_bytes_written = 0; 
    fprintf(stderr, "Sending bytes..."); 
    if(!WriteFile(hSerial,str, strlen(str), &bytes_written, NULL)) 
    { 
     fprintf(stderr, "Error\n"); 
     CloseHandle(hSerial); 
     return 1; 
    } 
    fprintf(stderr, "%d bytes written\n", bytes_written); 


// CLOSE SERIAL PORT AND EXIT MAIN FUNCTION 
//========================================= 
fprintf(stderr, "Closing serial port..."); 

if (CloseHandle(hSerial) == 0){fprintf(stderr, "Error\n"); return 1;} 
fprintf(stderr, "OK\n");return 0; 

} 

ответ

1

Вы можете использовать ReadFile() для этого:

BOOL bOk = ReadFile(hSerial, buffer, sizeof(buffer) - 1, &bytesRead, NULL); 
if (bOk && (bytesRead > 0)) { 
    buffer[bytesRead] = '\0'; 
} 

При чтении из последовательного порта, ReadFile() должен блокировать, пока не будет больше данных, или таймаут происходит. (это должно выполняться в отдельном потоке (в цикле) или, может быть, с использованием ReadFileEx() для асинхронной работы).

При чтении из устройства связи, поведение ReadFile является регулируется тока связи тайм-аут, как устанавливать и извлекать с помощью SetCommTimeouts и GetCommTimeouts функции. Непредсказуемые результаты могут возникать, если вы не можете установить значения тайм-аута.

Оформить заказ SetCommState() и PurgeComm().

+0

Спасибо. Но как узнать, когда нужно вызвать функцию ReadFile? Предположим, что если я хочу подождать, пока символ «Х» будет получен с микроконтроллера. Как мне заставить процессор ждать, пока я получу ответ UART с микроконтроллера? –

+0

@AhmadShah - При чтении с последовательного порта следует блокировать ReadFile(). См. Обновленный ответ. –

+0

Я отправляю данные с микроконтроллера каждую секунду. Правильны ли для CommTimouts следующие параметры: ReadIntervalTimeout = 5000; ReadTotalTimeoutConstant = 5000; ReadTotalTimeoutMultiplier = 1000; WriteTotalTimeoutConstant = 50; WriteTotalTimeoutMultiplier = 10; Могу ли я просто установить ReadIntervalTimeout, ReadTotalTimeoutConstant и ReadTotalTimeoutMultiplier на 0, чтобы ReadFile блокировался бесконечно? –

Смежные вопросы