C语言实现串口(USB)的数据收发

编程环境:VC++6.0(轻量级环境)
 

很多情况需要采集USB接口的数据。程序调试时会使用串口助手实现。

这里选择ESP8266作为载体实现串口数据的收发。

注意:ESP8266只是为了实现串口数据的传输,电脑端程序不需要考虑硬件是什么,它实现的只是通过USB完成数据的收发。

1.ESP8266需要通过AT命令做简单配置

将ESP8266配置成client(客服端)模式

AT命令:

AT功能
AT+CWMODE=3

设置成

1. Station(客户端模式)
2. AP(服务端模式)
3. Station+AP(混合模式)

AT+RST

复位

注:AT+CWMODE命令设置后需要将其复位后生效,该命令掉电不丢失,配置完后,就不需要反复复位操作。

AT+CIPMODE=1设置透传模式  
AT+CIPMUX=0设置单连接 
手机端连接ESP8266WiFi模块开启手机调试助手设置成服务器模式
AT+CIPSTART="TCP","192.168.4.2",8080连接TCP服务器 
AT+CIPSEND开始发送数据

通过电脑串口调试助手设置AT命令,如下:

 这是手机端就可以ESP8266发送数据,同时也可以接收串口助手的数据。

效果如下:

电脑串口接收手机端发来的数据

手机端接收电脑端发来的消息 

 这样就可以实现了数据的收发,但这样只是通过串口助手实现数据收发,假如,我们需要对接收的数据拿来为己所用,或想自己发送一些数据给USB传输出去呢?显然串口助手不能实现相应功能,因为它已经被封装好,不可以进行二次开发。

这里将是主要解决的问题——自己写一个程序实现USB数据的接收和发送

1.USB串口识别

因为电脑上一般会有多个USB口,而且每个USB口号也不一样,这时就需要通过软件去遍历串口号,直到找到所需要的串口号。代码如下:

for(i=0;i<10;i++)
	{
		hCom = CreateFile(_T(com[i]),//COMx口
			GENERIC_READ | GENERIC_WRITE,//允许读和写
			0,//独占方式
			NULL,
			OPEN_EXISTING,//打开而不是创建
			0,//同步方式
			NULL);
		if(hCom == (HANDLE)-1)
		{
			printf("打开COM%d失败!\n",(i+1));
			if(9 == i)
			{
				return FALSE;
			}
			continue;
		}
		else
		{
			printf("COM%d打开成功!\n",(i+1));
			break;
		}
	}

2.基本配置及波特率设置

设置缓冲区大小,超时,以及串口的通信频率(波特率)一些配置,代码如下:

	SetupComm(hCom, 20480, 20480);//输入缓冲区和输出缓冲区的大小都是1024
	
	COMMTIMEOUTS TimeOuts;//设定读超时	
	TimeOuts.ReadIntervalTimeout = 20;
	TimeOuts.ReadTotalTimeoutMultiplier = 500;
	TimeOuts.ReadTotalTimeoutConstant = 5000;	
	TimeOuts.WriteTotalTimeoutMultiplier = 500;//设定写超时
	TimeOuts.WriteTotalTimeoutConstant = 2000;
	SetCommTimeouts(hCom, &TimeOuts);//设置超时

	DCB dcb1;
	GetCommState(hCom, &dcb1);
	dcb1.BaudRate = 115200;//波特率为115200
	dcb1.ByteSize = 8;//每个字节有8位
	dcb1.Parity = NOPARITY;//无奇偶校验位
	dcb1.StopBits = TWOSTOPBITS;//两个停止位
	dcb1.fParity = FALSE;
	dcb1.fNull = FALSE;
	SetCommState(hCom, &dcb1);
	DWORD wCount = 256;//读取的字节数
	DWORD wCount1;
	DWORD dwWritelen = 0;	
	PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR);//清空缓冲区

3.循环接收和发送USB数据

代码中在循环读取USB数据,当读取到数据后,会将读取的数据再次通过USB发出去,到手机显示。

代码如下:

while(1)
	{
		PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR);//清空缓冲区
		
		strcpy(str,"");		//	清空数组空间	

		if(!ReadFile(hCom, str, wCount, &wCount1, NULL))
		{
			printf("读串口失败!");
			return FALSE;
		}		
		printf("读串口成功!\n");
		

		printf("读取长度为:%d\n", wCount1);
		printf("读取数据为:\n");
		for(i=0; i< wCount1; i++)
		{
			printf("%c", str[i]);
		}
		printf("\n");

		if(isPresent(str, "off") == 1)
		{

			dwWritelen = 0;
			sprintf(sendData,"The receipt data contains the specified data \"off\"\r\n");
			if(!WriteFile(hCom,sendData,strlen(sendData),&dwWritelen,NULL))		
			{
				printf("串口发送数据失败!\n");
			}
			///system("shutdown -p");	//	电脑关机
		}

		dwWritelen = 0;
		sprintf(sendData,"rec data is : %s",str);
		if(!WriteFile(hCom,sendData,strlen(sendData),&dwWritelen,NULL))		
		{
			printf("串口发送数据失败!\n");
		}
		
		printf("\n");
	}

实现效果:

自写的串口读写程序,接收USB的数据,

 手机端接收电脑USB发来的数据:

提醒大家一下:这里的ESP8266只是一个载体,并不影响电脑端的C程序,C程序只是实现USB数据的读取(接收)和写入(发送)。若换其它载体对C代码没有影响,只要是通过USB传输数据就可以使用。

源码连接

(2条消息) C/C++语言实现串口(USB)的数据收发资源-优快云文库

吾芯电子工作室

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小材大用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值