VC2005串口通信遇到的问题

本文介绍使用VC2005进行串口通信的实现方法,包括串口的初始化、设置及数据发送过程,并针对遇到的字符串编码问题和重定义问题提供多种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VC2005串口通信遇到的问题

HANDLE hCom;  //全局变量,串口句柄
		// TODO: Add extra initialization here
	hCom=CreateFile(CString("//.///COM14"),//COM1口
		GENERIC_READ|GENERIC_WRITE, //允许读和写
		0, //独占方式
		NULL,
		OPEN_EXISTING, //打开而不是创建
		0, //同步方式
		NULL);
	if(hCom==(HANDLE)-1)
	{
		//AfxMessageBox("打开COM失败!");
		//return FALSE;
	}

	SetupComm(hCom,100,100); //输入缓冲区和输出缓冲区的大小都是100

	COMMTIMEOUTS TimeOuts;
	//设定读超时
	TimeOuts.ReadIntervalTimeout=MAXDWORD;
	TimeOuts.ReadTotalTimeoutMultiplier=0;
	TimeOuts.ReadTotalTimeoutConstant=0;
	//在读一次输入缓冲区的内容后读操作就立即返回,
	//而不管是否读入了要求的字符。


	//设定写超时
	TimeOuts.WriteTotalTimeoutMultiplier=100;
	TimeOuts.WriteTotalTimeoutConstant=500;
	SetCommTimeouts(hCom,&TimeOuts); //设置超时

	DCB dcb;
	GetCommState(hCom,&dcb);
	dcb.BaudRate=9600; //波特率为9600
	dcb.ByteSize=8; //每个字节有8位
	dcb.Parity=NOPARITY; //无奇偶校验位
	dcb.StopBits=TWOSTOPBITS; //两个停止位
	SetCommState(hCom,&dcb);

	PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

	char lpOutBuffer[7];
	memset(lpOutBuffer,'\0',7); //前7个字节先清零
	lpOutBuffer[0]='\x11';  //发送缓冲区的第1个字节为DC1
	lpOutBuffer[1]='0';  //第2个字节为字符0(30H)
	lpOutBuffer[2]='0'; //第3个字节为字符0(30H)
	lpOutBuffer[3]='1'; // 第4个字节为字符1(31H)
	lpOutBuffer[4]='0'; //第5个字节为字符0(30H)
	lpOutBuffer[5]='1'; //第6个字节为字符1(31H)
	lpOutBuffer[6]='\x03'; //第7个字节为字符ETX
	//从该段代码可以看出,仪表的通讯地址为001
	
	DWORD dwBytesWrite=7;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	BOOL bWriteStat;
	ClearCommError(hCom,&dwErrorFlags,&ComStat);
	bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);


	CloseHandle(hCom);

vc2005里面可以调用windowns api的函数CreateFile(),利用这个函数创建串口,利用WriteFile()函数进行发送数据。

遇到问题1:字符串编码问题

CreateFile()函数内部使用了LPCWSTR类型的参数,不能"const char *”转换为“LPCWSTR”。这里是unicode编码的问题。可以用

解决办法1:项目属性页->配置属性->常规->字符集->使用多字节字符集,编译

解决办法2: CString(strname)修改要输入的串口名

解决办法3:包含头文件 #include <afxpriv.h> 1、在HANDLE hFile语句之前加上,USES_CONVERSION//声明标示符 2、调用函数A2W把ascii字符串转换成宽字符串,HANDLE hFile = ::CreateFile(A2W(strname), GENERIC_WRITE | GENERIC_READ, 0, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); .

解决办法4:把CreateFile改成CreateFileA试试

遇到问题2:重定义

HANDLE hCom; //全局变量,串口句柄
这个定义放在了.H文件中说很多文件重定义了,但是放在了CPP文件中错误消失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值