在Windows中使用C语言实现UART
我正在尝试使用C在外部微控制器和Windows之间建立UART接口 我使用下面的代码设置UART参数,然后向指定的COM端口发送一个字符 我成功地发送了一个字符。但是我怎么才能收到一个呢?代码如下:在Windows中使用C语言实现UART,c,windows,uart,C,Windows,Uart,我正在尝试使用C在外部微控制器和Windows之间建立UART接口 我使用下面的代码设置UART参数,然后向指定的COM端口发送一个字符 我成功地发送了一个字符。但是我怎么才能收到一个呢?代码如下: #include <windows.h> #include <stdio.h> #include <conio.h> #include <math.h> #include <string.h> HANDLE hSerial; int ma
#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;
}
#包括
#包括
#包括
#包括
#包括
处理串行;
int main()
{
//打开串行端口并设置初始UART参数
//=================================================
DCB dcbSerialParams={0};COMMTIMEOUTS timeouts={0};
fprintf(标准“打开串行端口…”);
hSerial=CreateFile(“\\\.\\COM3”,泛型读写,0,空,打开,存在,文件属性正常,空);
如果(hSerial==无效的句柄值){fprintf(stderr,“Error\n”);返回1;}
else{fprintf(stderr,“OK\n”);}
//设置设备参数(115200波特,1个起始位,1个停止位,无奇偶校验)
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
if(GetCommState(hSerial,&dcbSerialParams)==0){fprintf(stderr,“获取设备状态时出错”);CloseHandle(hSerial);返回1;}
dcbSerialParams.BaudRate=CBR_57600;dcbSerialParams.ByteSize=8;dcbSerialParams.StopBits=ONESTOPBIT;dcbSerialParams.Parity=NoPrity;
if(SetCommState(hSerial,&dcbSerialParams)==0){fprintf(stderr,“设置设备参数时出错”);CloseHandle(hSerial);返回1;}
//设置COM端口超时设置
timeouts.ReadIntervalTimeout=50;timeouts.ReadTotalTimeoutConstant=50;timeouts.ReadTotalTimeout乘数=10;
timeouts.WriteTotalTimeoutConstant=50;timeouts.WriteTotalTimeout乘数=10;
if(SetCommTimeouts(hSerial,&timeouts)==0){fprintf(stderr,“设置超时时出错”);CloseHandle(hSerial);返回1;}
//设置并从UART发送数据
//==============================
int VarNum=8;
char-str[15];
sprintf(str,“%ld”,VarNum);
写入的DWORD字节数,写入的总字节数=0;
fprintf(stderr,“发送字节…”);
if(!WriteFile(hSerial,str,strlen(str),&bytes\u writed,NULL))
{
fprintf(stderr,“Error\n”);
闭合手柄(hs系列);
返回1;
}
fprintf(stderr,“%d字节写入\n”,字节写入);
//关闭串行端口并退出主功能
//=========================================
fprintf(stderr,“关闭串行端口…”);
if(CloseHandle(hSerial)==0){fprintf(stderr,“Error\n”);返回1;}
fprintf(stderr,“OK\n”);返回0;
}
您可以使用ReadFile()
进行以下操作:
BOOL bOk = ReadFile(hSerial, buffer, sizeof(buffer) - 1, &bytesRead, NULL);
if (bOk && (bytesRead > 0)) {
buffer[bytesRead] = '\0';
}
从串行端口读取数据时,ReadFile()
应阻塞,直到有更多数据或超时。(这应该在单独的线程(在循环中)中完成,或者可以使用异步操作的ReadFileEx()
)
从通信设备读取时,ReadFile的行为是
由设置和检索的当前通信超时控制
使用SetCommTimeouts
和GetCommTimeouts
功能。不可预知的
如果未能设置超时值,则可能会出现结果
还要签出
SetCommState()
和purgecom()
谢谢。但是,我如何知道何时调用ReadFile函数呢?假设我想等到字符“X”从微控制器出来。如何让CPU一直等待,直到我从微控制器收到UART响应?@AhmadShah-从串行端口读取时,ReadFile()应该会阻塞。请参阅更新的答案。我每隔一秒钟从微控制器发送一次数据。以下参数对于COMMTIMOUT是否正确:ReadIntervalTimeout=5000;ReadTotalTimeoutConstant=5000;ReadTotalTimeOut乘数=1000;WriteTotalTimeoutConstant=50;WriteTotalTimeout乘数=10;我可以将ReadIntervalTimeout、ReadTotalTimeoutConstant和ReadTotalTimeOut乘数设置为0,以便ReadFile无限期阻塞吗?我不会将它们设置为0:“如果设置超时值失败,可能会出现不可预测的结果。”。