赞
踩
编程环境:VC++6.0(轻量级环境)
很多情况需要采集USB接口的数据。程序调试时会使用串口助手实现。
这里选择ESP8266作为载体实现串口数据的收发。
注意:ESP8266只是为了实现串口数据的传输,电脑端程序不需要考虑硬件是什么,它实现的只是通过USB完成数据的收发。
1.ESP8266需要通过AT命令做简单配置
将ESP8266配置成client(客服端)模式
AT命令:
AT | 功能 |
AT+CWMODE=3 | 设置成 1. Station(客户端模式) |
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传输数据就可以使用。
源码连接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。