⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serialportqt4.c

📁 用QT4实现串口通信
💻 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 + -