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

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

前期准备

串口调试小助手:

模拟串口工具:

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发送的数据,至此,基础实验部分就完成了。

相关推荐
孙严Pay4 小时前
快捷支付:高效安全的在线支付新选择
笔记·科技·计算机网络·其他·微信
じ☆冷颜〃4 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
数据皮皮侠AI5 小时前
上市公司股票名称相似度(1990-2025)
大数据·人工智能·笔记·区块链·能源·1024程序员节
yuhaiqun19896 小时前
学服务器训练AI模型:5步路径助力高效入门
运维·服务器·人工智能·笔记·机器学习·ai
雍凉明月夜6 小时前
深度学习网络笔记Ⅳ(Transformer + VIT)
笔记·深度学习·transformer
做cv的小昊7 小时前
【TJU】信息检索与分析课程笔记和练习(7)数据库检索—Ei
数据库·笔记·学习·全文检索
Chris_12197 小时前
Halcon学习笔记-Day6:工业视觉高级技术应用与实战项目
笔记·学习·halcon
AI视觉网奇9 小时前
audio2face mh_arkit_mapping_pose_A2F 不兼容
笔记·ue5
wdfk_prog9 小时前
[Linux]学习笔记系列 -- [fs]super
linux·笔记·学习
日更嵌入式的打工仔10 小时前
单片机基础知识:内狗外狗/软狗硬狗
笔记·单片机