射频识别技术课程实验--模拟串口间的通信--基础实验

射频识别技术课程实验--模拟串口间的通信

前期准备

串口调试小助手:

模拟串口工具:

Visual Studio 2022:

测试代码(c++):

c++ 复制代码
#include<iostream>
#include<Windows.h>

using namespace std;

int main() 
{
	system("color 3F");
	HANDLE hCom = CreateFile("\\\\.\\COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,// 指定串口编号
		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
	if (INVALID_HANDLE_VALUE == hCom)
	{
		cout << "serial open failed" << endl;
		system("pause");
		return -1;
	};

	//设置串口
	//1、设置输入输出缓冲区大小
	SetupComm(hCom, 1024, 1024);
	//2、设置时延
	COMMTIMEOUTS TimeOuts;
	TimeOuts.ReadIntervalTimeout = 1000;
	TimeOuts.ReadTotalTimeoutMultiplier = 500;
	TimeOuts.ReadTotalTimeoutConstant = 5000;//设定写超时
	TimeOuts.WriteTotalTimeoutMultiplier = 500;
	TimeOuts.WriteTotalTimeoutConstant = 2000;
	SetCommTimeouts(hCom, &TimeOuts);
	//3、DCB结构体
	DCB dcb;
	GetCommState(hCom, &dcb);
	dcb.BaudRate = 9600;
	dcb.ByteSize = 32;
	dcb.StopBits = 1;
	SetCommState(hCom, &dcb);
	//4、清空硬件的通信错误,清空输入输出缓冲,为W/R做准备
	PurgeComm(hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);



	//5、发送串口信息
	char buffer[] = { 0XFE, 0X03, 0X04, 0X00, 0X03, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFA };
	DWORD dwBytesToWrite = sizeof(buffer);
	DWORD dwBytesRealWrite;
	DWORD dwErrorFlags;
	COMSTAT comStat;
	OVERLAPPED osWrite;
	//memset(&osWrite,0,sizeof(OVERLAPPED));
	osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	osWrite.Offset = 0;
	osWrite.OffsetHigh = 0;
	//清除硬件通信错误;
	ClearCommError(hCom, &dwErrorFlags, &comStat);
	BOOL bWriteStatus;
	bWriteStatus = WriteFile(hCom, buffer, dwBytesToWrite, &dwBytesRealWrite, &osWrite);
	int m = GetLastError();
	if (!bWriteStatus)
	{
		if (GetLastError() == ERROR_IO_PENDING)
		{
			WaitForSingleObject(osWrite.hEvent, 2000);

			//清理IO缓冲区;
			PurgeComm(hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
		}
		else
		{
			cout << "failed to send" << endl;
			system("pause");
			return -1;
		}
		PurgeComm(hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
	}
	PurgeComm(hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);

	//6、接收串口信息
	unsigned char lpInBuffer[1024];
	DWORD dwBytesRead;
	OVERLAPPED osRead;
	memset(&osRead, 0, sizeof(OVERLAPPED));
	

	BOOL bReadStatus;
	DWORD dwRealRead;
	while (1)
	{
		dwBytesRead = 1024;
		osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
		ClearCommError(hCom, &dwErrorFlags, &comStat);
		dwBytesRead = min(dwBytesRead, (DWORD)comStat.cbInQue);
		if (!dwBytesRead)
		{
			//cout << "no data to be read" << endl;
			Sleep(1000);
			continue;
		}

		bReadStatus = ReadFile(hCom, lpInBuffer, dwBytesRead, &dwRealRead, &osRead);

		if (!bReadStatus)
			//如果ReadFile函数返回FALSE
		{
			if (GetLastError() == ERROR_IO_PENDING)
				//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
			{
				WaitForSingleObject(osRead.hEvent, 2000);
				//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
				//当串口读操作进行完毕后,osRead的hEvent事件会变为有信号
				PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

				short *temp = new  short[dwRealRead + 1];
				for (int i = 0; i < dwBytesRead; ++i)
				{
					temp[i] = lpInBuffer[i];
					printf("%02X", temp[i]);
				}
				cout << endl;
				/*delete[] temp;*/
			}
			else
				cout << "failed to read" << endl;
		}
		else
		{
			short *temp = new  short[dwRealRead + 1];
			for (int i = 0; i < dwBytesRead; ++i)
			{
				temp[i] = lpInBuffer[i];
				printf("%02X", temp[i]);
			}
			cout << endl;
			delete[] temp;
		}
		Sleep(1000);
		PurgeComm(hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
	}
	PurgeComm(hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
	system("pause");
}

实验过程

基础实验

  1. 模拟两个串口

  2. 打开两个串口调试小助手,分别打开上一步模拟的两个串口,这里我创建的串口名字为"COM1"和"COM2"。

  3. 测试串口连通性:

    可以看到串口连通性正常,两端都可以互相发送数据。

  4. 打开Visual Studio 2022,新建空项目

  5. 将准备好的代码放在源文件中,运行调试:

    发现提示serial open failed,这是因为我们一开始打开了两个串口,并且代码中指定串口编号为COM2,但是COM2已经打开了,所以报错串口开启失败。

    c++ 复制代码
    HANDLE hCom = CreateFile("\\\\.\\COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,// 指定串口编号
  6. 于是我们关闭COM2,保留COM1

    这时再次运行C++程序,使用串口COM1发送数据:

    此时我们的C++程序扮演的角色其实就是串口COM2,接收到串口COM1发送的数据,至此,基础实验部分就完成了。

相关推荐
霍格沃兹测试开发学社测试人社区27 分钟前
软件测试学习笔记丨Flask操作数据库-数据库和表的管理
软件测试·笔记·测试开发·学习·flask
幸运超级加倍~1 小时前
软件设计师-上午题-16 算法(4-5分)
笔记·算法
王俊山IT1 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
Yawesh_best2 小时前
思源笔记轻松连接本地Ollama大语言模型,开启AI写作新体验!
笔记·语言模型·ai写作
CXDNW4 小时前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
使者大牙4 小时前
【大语言模型学习笔记】第一篇:LLM大规模语言模型介绍
笔记·学习·语言模型
ssf-yasuo4 小时前
SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记
论文阅读·笔记·prompt
ajsbxi4 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
TeYiToKu4 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws4 小时前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习