Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CDC
AIR724的USB CDC驱动分享
发布于 2021-03-26 16:07:53 浏览:1905
订阅该版
[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
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
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
串口
LWIP
Env
AT
SPI
Bootloader
FinSH
ART-Pi
CAN总线
Hardfault
USB
文件系统
RT-Thread
DMA
SCons
线程
MQTT
RT-Thread Nano
STM32
RTC
rt-smart
ESP8266
flash
ota在线升级
WIZnet_W5500
FAL
I2C
packages_软件包
UART
cubemx
freemodbus
潘多拉开发板_Pandora
定时器
BSP
PWM
ADC
socket
中断
rt_mq_消息队列_msg_queue
keil_MDK
SDIO
Debug
AB32VG1
MicroPython
编译报错
C++_cpp
msh
ulog
QEMU
本月问答贡献
出出啊
1501
个答案
338
次被采纳
小小李sunny
1390
个答案
276
次被采纳
张世争
715
个答案
157
次被采纳
crystal266
522
个答案
153
次被采纳
whj467467222
1216
个答案
146
次被采纳
本月文章贡献
出出啊
1
篇文章
12
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
2
篇文章
2
次点赞
crystal266
2
篇文章
5
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部