Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CDC
AIR724的USB CDC驱动分享
发布于 2021-03-26 16:07:53 浏览:2413
订阅该版
[tocm] # 针对合宙的AIR724模块实现的USB CDC驱动。 驱动本身很简单,只是将模块的三个CDC串口注册成了普通的字符串驱动,因此可以直接使用AT指令进行通信,速度自然是会比普通串口快的,至于快多少不知道,没去测,稳定性感觉应该反而是不如232的,至少我是这么感觉的,毕竟是因为代码协议复杂化了,所以稳定性反而会造成下降。 - [usbhost.rar](https://oss-club.rt-thread.org/uploads/20210326/5d371ae5da80f26907fb7e908d370471.rar) 这个文件解压到`components\drivers\usb\usbhost`替换源文件。 - [inclue_drivers.rar](https://oss-club.rt-thread.org/uploads/20210326/3a6efc8c255be960c60fe06393f5c314.rar) 这个文件解压到`components\drivers\include\drivers`替换源文件。 这里需要注意下,由于CDC走AT指令是有接收任意字节数返回概念的,而这点在官方驱动里是没有的,因此为了解决这个问题,官方驱动里面我增加了一个专门用于接收任意字节数的函数,用于适应CDC的这种特性,不然功能没法玩。具体的因为个人代码比较烂,不多说了。 这里给出下简单的应用代码。 ```c while (1) { //延时两秒 if (rt_device_find("CDC00") != RT_NULL) { rt_thread_delay(2000); if (rt_device_find("CDC00") != RT_NULL) { { //创建一个用于显示当前运行状态的线程 rt_thread_startup(rt_thread_create("state", led_run_entry, RT_NULL, 1024, 21, 10)); } rt_hw_modem_init("CDC00", "3GNET", "", ""); { //IOT任务启动 extern void iot_app_init(void); iot_app_init(); } { extern void master_start(void); //创建一个基于Modbus的应用 master_start(); } return 0; } } rt_thread_delay(1000); } ``` 由于USB驱动初始化到挂载成功是有过程的,所以需要判断是否存在才能进行操作,具体使用也简单。这里给出AT使用函数实体。 ```c static int at_command(rt_device_t handle, char * buffer, const char *at, const char *ack, int timeout) { int len; uint32_t totlen; uint32_t u32Len; uint32_t u32RecvLen; uint8_t *u8Buffer = (uint8_t *)buffer; // 如果设备不存在,被注销了 if(rt_object_get_type(&handle->parent) != RT_Object_Class_Device) { return -3; } u32Len = timeout; rt_device_control(handle, RT_DEVICE_CTRL_TIMEOUT, &u32Len); sprintf(buffer, "%s", at); AT_CMD_TRACE(buffer); rt_device_write(handle, 0, buffer, strlen(buffer)); // 如果设备不存在,被注销了 if(rt_object_get_type(&handle->parent) != RT_Object_Class_Device) { return -3; } totlen = 512; len = rt_device_read(handle, 0, u8Buffer, totlen); if(len <= 0) { return -1; } totlen -= len; u8Buffer += len; u32RecvLen = len; // 如果设备不存在,被注销了 if(rt_object_get_type(&handle->parent) != RT_Object_Class_Device) { return -3; } u32Len = 10; rt_device_control(handle, RT_DEVICE_CTRL_TIMEOUT, &u32Len); do { // 如果设备不存在,被注销了 if(rt_object_get_type(&handle->parent) != RT_Object_Class_Device) { return -3; } len = rt_device_read(handle, 0, u8Buffer, totlen); if(len <= 0) { break; } totlen -= len; u8Buffer += len; u32RecvLen += len; } while(totlen > 0); buffer[u32RecvLen] = 0; if(u32RecvLen < 2) { return -2; } AT_ACK_TRACE(buffer); if(strstr(buffer, ack) == RT_NULL) { return -1; } return 0; } ``` 调用方式 ```c int air724_at_dial(rt_device_t handle, uint8_t *buffer, const char *apn) { uint32_t u32Len; /* ** Step 1, 一般命令,设置应答超时为5秒,接收时间间隔为1秒 */ // u32Len = 5000; // rt_device_control(handle, RT_DEVICE_CRTL_TIMEOUT, &u32Len); // u32Len = 1000; // rt_device_control(handle, RT_DEVICE_CTRL_INTERVAL, &u32Len); /* ** Step 2, AT指令测试 */ if(at_command(handle,(char *)buffer, "AT\r\n", "OK", 1000) < 0) { return -1; } /* ** Step 3, 关闭回显 */ if(at_command(handle,(char *)buffer, "ATE0\r\n", "OK", 1000) < 0) { return -1; } // 确认模块能联网 if(at_command(handle, (char *)buffer, "AT+CGATT?\r\n", "OK", 5000) < 0) { return 0; } else { char *start; start = strstr((char *)buffer,"+CGATT: "); if(start == RT_NULL) { return 0; } start += 8; if(strncmp(start, "1", 1) != 0) { rt_kprintf("modem can't connect to internect\r\n"); return 0 ; } } /* ** Step 8, 检测模块是否注册上网 */ if(at_command(handle,(char *)buffer, "AT+CREG?\r\n", "OK",5000) < 0) { return 0; } /* ** Step 9, 查询基站信息 */ if(at_command(handle,(char *)buffer, "AT+CGREG?\r\n", "OK",5000) < 0) { return 0; } // if(at_command(handle,(char *)buffer, "AT+CGREG=?\r\n", "OK", 5000) < 0) { // return 0; // } /* ** Step 10, 查看GPRS网络帮助信息 */ if(at_command(handle,(char *)buffer, "AT+CGDCONT=?\r\n", "OK", 5000) < 0) { return 0; } /* ** Step 11, Before active, use this command to set PDP context.此后的命令可能等待较长 */ sprintf((char *)&buffer[512], "AT+CGDCONT=1, \"IP\", \"%s\"\r\n", apn); if(at_command(handle,(char *)buffer, (char *)&buffer[512], "OK", 100000) < 0) { return 0; } /* ** Step 12, This command is to start PPP translation. */ if(at_command(handle,(char *)buffer, "ATD*99#\r\n", "CONNECT", 100000) < 0) { at_command(handle,(char *)buffer, "+++", "OK", 100000); rt_kprintf("enter ppp success!\r\n"); return 0; } if(strstr((char *)buffer, "DISCONNECT") != RT_NULL) { at_command(handle,(char *)buffer, "+++", "OK", 100000); return 0; } return 1; } ``` 至于驱动打开什么的那就不发了,怕侮辱你们智商。orZ ## PS AT部分的代码是照搬天使的海洋这位大神的,表示感谢。
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
xiao苦
这家伙很懒,什么也没写!
文章
1
回答
244
被采纳
0
关注TA
发私信
相关文章
1
STM32H743 USBhost+cdc有没有大神会的,有偿求助啊。
2
usb设备cdc配置框架理解问题
3
STM32 USB Host驱动 CDC ECM
4
请问大家有没有遇到过USB识别很慢的情况
5
STM32 USB CDC驱动4G模块 开发进行中...
6
关于usbd设备的使用问题
7
RTT USB iManufacturer iProduct如何修改
8
CDC虚拟串口rxbuffer 大小
9
win7 64bit 系统的 USB CDC 驱动问题
10
RT-Thread 4.0.5 CDC 接收问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部