Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows中使用C语言实现UART_C_Windows_Uart - Fatal编程技术网

在Windows中使用C语言实现UART

在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

我正在尝试使用C在外部微控制器和Windows之间建立UART接口

我使用下面的代码设置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;

}
#包括
#包括
#包括
#包括
#包括
处理串行;
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:“如果设置超时值失败,可能会出现不可预测的结果。”。