在Windows中使用C的UART

我试图build立一个外部微控制器和Windows之间使用C的UART接口。

我使用以下代码来设置UART参数,然后将字符发送到指定的COM端口。

我成功地发送了一个angular色。 但是我怎么收到一个回来? 代码如下:

#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; } 

您可以使用ReadFile()

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

从串行端口读取时, ReadFile()应该阻塞,直到有更多的数据或发生超时。 (这应该在单独的线程中完成(在一个循环中),或者可以通过使用ReadFileEx()进行异步操作)。

从通信设备读取时,ReadFile的行为由设置和检索的当前通信超时管理,使用SetCommTimeoutsGetCommTimeouts函数。 如果您未能设置超时值,则会发生不可预测的结果。

还检出SetCommState()PurgeComm()