📄 serialportqt4.c
字号:
#include<stdio.h>
#include<windows.h>
#include<QString>
#include<QObject>
//全局变量:
HANDLE hFile; //串口句柄
DCB dcb; //串口参数结构体
COMMTIMEOUTS ct;
DWORD baudrate = 9600;
BYTE stopbits = 0;
BYTE parity = 0;
BYTE databits = 8;
QString strport = "COM1";
bool InitCOM(DWORD BaudRate, BYTE ByteSize, BYTE StopBits, BYTE Parity)
{
//设置DCB
if(!GetCommState(hFile, &dcb)) //获取串口当前状况
{
close();
return false;
}
dcb.BaudRate = BaudRate;
dcb.ByteSize = ByteSize;
dcb.StopBits = StopBits;
dcb.Parity = Parity;
if(!SetCommState(hFile, &dcb))
{
close();
return false ;
}
//设置超时值
ct.ReadIntervalTimeout = MAXDWORD;
ct.ReadTotalTimeoutConstant = 0;
ct.ReadTotalTimeoutMultiplier = 0;
ct.WriteTotalTimeoutConstant = 0;
ct.WriteTotalTimeoutMultiplier = 0;
if(!SetCommTimeouts(hFile, &ct))
{
close();
return false;
}
return true;
}
//关闭串口
void close()
{
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
//写数据
bool writeData(char * writeBuffer)
{
DWORD numData = strlen(writeBuffer); //strlen(writeBuffer);
DWORD writeNum = 0;
WriteFile(hFile, writeBuffer, numData, &writeNum, NULL);
if(writeNum != numData)
return false;
return true;
}
int readData(char * data)
{
DWORD numData = 100;
DWORD ReadNum = 0;
DWORD commErrors = 0;
COMSTAT commStat;
ClearCommError(hFile, &commErrors, &commStat); //清除串口错误
if(ReadFile(hFile, data, numData, &ReadNum, NULL) == false)
{
ReadNum = false;
}
return ReadNum;
}
void setCOM(QString StrPort, DWORD BaudRate, BYTE ByteSize, BYTE StopBits, BYTE Parity)
{
baudrate = BaudRate;
stopbits = StopBits;
parity = Parity;
databits = ByteSize;
strport = StrPort;
}
//主函数
int main()
{
int len;
char * writebufer = new char[100];
char * readbuffer = new char[100];
//打开串口
hFile = CreateFileA(strport.toAscii() ,GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,0, NULL);
if(hFile == INVALID_HANDLE_VALUE)
return false;
//设置缓冲区大小,并清除缓冲区
if(!SetupComm(hFile, READBUFFER, WRITEBUFFER)||!PurgeComm(hFile,PURGE_TXCLEAR|PURGE_RXCLEAR))
{
close();
return false ;
}
//初始化串口
if(InitCOM(baudrate, databits, stopbits, parity) == false)
{
close(); //如果失败就关闭,退出
return false;
}
//循环读写数据
while(1)
{
writeData(writebufer);
readData(readbuffer);
len = strlen(readbuffer);
if(readbuffer[len-1] = 'q') //如果最后一个字母为'q',就退出循环结束
break;
len = 0;
}
close(); //关闭
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -