当前位置:   article > 正文

C语言实现串口(USB)的数据收发_c usb通讯

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口号也不一样,这时就需要通过软件去遍历串口号,直到找到所需要的串口号。代码如下:

  1. for(i=0;i<10;i++)
  2. {
  3. hCom = CreateFile(_T(com[i]),//COMx口
  4. GENERIC_READ | GENERIC_WRITE,//允许读和写
  5. 0,//独占方式
  6. NULL,
  7. OPEN_EXISTING,//打开而不是创建
  8. 0,//同步方式
  9. NULL);
  10. if(hCom == (HANDLE)-1)
  11. {
  12. printf("打开COM%d失败!\n",(i+1));
  13. if(9 == i)
  14. {
  15. return FALSE;
  16. }
  17. continue;
  18. }
  19. else
  20. {
  21. printf("COM%d打开成功!\n",(i+1));
  22. break;
  23. }
  24. }

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

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

  1. SetupComm(hCom, 20480, 20480);//输入缓冲区和输出缓冲区的大小都是1024
  2. COMMTIMEOUTS TimeOuts;//设定读超时
  3. TimeOuts.ReadIntervalTimeout = 20;
  4. TimeOuts.ReadTotalTimeoutMultiplier = 500;
  5. TimeOuts.ReadTotalTimeoutConstant = 5000;
  6. TimeOuts.WriteTotalTimeoutMultiplier = 500;//设定写超时
  7. TimeOuts.WriteTotalTimeoutConstant = 2000;
  8. SetCommTimeouts(hCom, &TimeOuts);//设置超时
  9. DCB dcb1;
  10. GetCommState(hCom, &dcb1);
  11. dcb1.BaudRate = 115200;//波特率为115200
  12. dcb1.ByteSize = 8;//每个字节有8
  13. dcb1.Parity = NOPARITY;//无奇偶校验位
  14. dcb1.StopBits = TWOSTOPBITS;//两个停止位
  15. dcb1.fParity = FALSE;
  16. dcb1.fNull = FALSE;
  17. SetCommState(hCom, &dcb1);
  18. DWORD wCount = 256;//读取的字节数
  19. DWORD wCount1;
  20. DWORD dwWritelen = 0;
  21. PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR);//清空缓冲区

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

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

代码如下:

  1. while(1)
  2. {
  3. PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR);//清空缓冲区
  4. strcpy(str,""); // 清空数组空间
  5. if(!ReadFile(hCom, str, wCount, &wCount1, NULL))
  6. {
  7. printf("读串口失败!");
  8. return FALSE;
  9. }
  10. printf("读串口成功!\n");
  11. printf("读取长度为:%d\n", wCount1);
  12. printf("读取数据为:\n");
  13. for(i=0; i< wCount1; i++)
  14. {
  15. printf("%c", str[i]);
  16. }
  17. printf("\n");
  18. if(isPresent(str, "off") == 1)
  19. {
  20. dwWritelen = 0;
  21. sprintf(sendData,"The receipt data contains the specified data \"off\"\r\n");
  22. if(!WriteFile(hCom,sendData,strlen(sendData),&dwWritelen,NULL))
  23. {
  24. printf("串口发送数据失败!\n");
  25. }
  26. ///system("shutdown -p"); // 电脑关机
  27. }
  28. dwWritelen = 0;
  29. sprintf(sendData,"rec data is : %s",str);
  30. if(!WriteFile(hCom,sendData,strlen(sendData),&dwWritelen,NULL))
  31. {
  32. printf("串口发送数据失败!\n");
  33. }
  34. printf("\n");
  35. }

实现效果:

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

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

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

源码连接

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

吾芯电子工作室

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/1009005
推荐阅读
相关标签
  

闽ICP备14008679号