【原创开源】 基于 STM32F103C6T6 的 USB 转 RS232 模块..
由基于 STM32F103C8T6 的开源智能充电器引发一个小开源项目:基于 STM32F103C6T6 的 USB 转 RS232 模块.
我想大家已经很熟悉 OurAVR 以前介绍的 FT232BM , CH431 等等专用的 USB 转 RS232 芯片了. 这些可以通过网站以前的资料中获得.
在这个贴子我将向大家介绍一下自己做的 USB 转 RS232 模块.
大家已经很熟悉 STM32F103 系列的芯片片内都带一个 USB SLAVE 的硬件模块, 直接可以用他来实现 USB 功能.
我们就是利用了这个功能来实现 USB 转 RS232 的功能.
下面所有资源都是我和虫子两个人利用业余时间完成的所有资源, 包括软硬件, 现在全部开源.
-------------------------------------------------------
硬件
Protel99格式 PCB: 点击此处下载 ourdev_506342.rar(文件大小:16K) (原文件名:USBTO232.rar)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506415.jpg
(原文件名:10.jpg)
-------------------------------------------------------
软件:
其实把软件说白了就是串口中断得到的数据通过 USB 中断发出去, 满足 PC 的 CDC 模式. USB 接收中断获得的 CDC 模式的数据通过 STM32 的串口再发送出去, STM32 只起到一个搬运工的作用.
基于 MDK3.50 和 IAR5.20 以上版本的工程下载:
点击此处下载 ourdev_506356.rar(文件大小:2.49M) (原文件名:Virtual_COM_Port.rar)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506416.jpg
(原文件名:11.jpg)
Windows 下的驱动文件下载:
点击此处下载 ourdev_506590.rar(文件大小:13K) (原文件名:麦思网 USB-232 Driver.rar)
Hex 下载:
点击此处下载 ourdev_506347.rar(文件大小:8K) (原文件名:烧写 Hex.rar)
ISP 下载软件:
点击此处下载 ourdev_506357.rar(文件大小:577K) (原文件名:mcuisp.rar)
备注: 由 ISP 下载程序的时候需要短接 模块上的 CON1 跳线, 设置 Boot0, 让上电程序从片内 Booload 启动. 下载完程序将 CON1 断开.
-------------------------------------------------------
性能测试过程:
准备过程: 由于我电脑没有串口所以也用了一个 USB 转 RS232 模块来测试我们自己制作的模块的功能, 如下图所示:
Com7 为成品 USB 转 RS232 模块. 他使用的是性能比较好的 FT232BM 芯片.
Com4 为我们自己制作的 USB 转 RS232 模块. 使用的是 STM32F103C6T6 芯片, 烧入的上面贴出来的代码.
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506365.jpg
(原文件名:6.jpg)
两个模块通过一个两边都是母头的串口交叉线相连:
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506393.jpg
(原文件名:1.jpg)
第一个试验:
由我们的 USB 转 RS232 模块发送数据到 串口端, 即 USB 端 发送到 串口端.
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506371.JPG
(原文件名:9.JPG)
过程: 发送一个文件 第05章+STM32系列微控制器开发工具与应用.pdf. 115200 波特率
结果为: 发送 524288 个字节, 接收也为 524288 个字节.
结论: 没有丢包
第一个试验:
由我们的 USB 转 RS232 模块接收数据到 USB 端, 即 串口端 发送到 USB 端.
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506372.jpg
(原文件名:8.jpg)
过程: 发送一个文件 第05章+STM32系列微控制器开发工具与应用.pdf. 115200 波特率
结果为: 发送 524288 个字节, 接收也为 524288 个字节.
结论: 没有丢包
第三个试验:
两边同时互相 10 mS 定时 发送数据: 发送 ASCII 字符串 "1234567890"
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506376.jpg
(原文件名:7.jpg)
过程: 两边同时互相 10 mS 定时 发送数据: 发送 ASCII 字符串 "1234567890". 115200 波特率
结果为: 串口4 :发送 3033 个字节, 接收为 4581. 串口7 :发送 4581 个字节, 接收为 3033.
结论: 没有丢包
通过上面三个试验我可以说我们的 USB 转 RS232 模块基本达标, 应该为一个合格的小产品.
下面再贴出一些我们自己制作的 USB 转 RS232 的照片:
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506402.jpg
(原文件名:2.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506403.jpg
(原文件名:3.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506404.jpg
(原文件名:4.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506405.jpg
(原文件名:5.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506408.jpg
(原文件名:4.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506409.jpg
(原文件名:5.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506410.jpg
(原文件名:6.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506411.jpg
(原文件名:7.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506412.jpg
(原文件名:9.jpg)
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_506413.jpg
(原文件名:10.jpg) 顶一个,很早已经拿ST的三合一板当USB-CDC用了。 有价格优势? 【1楼】 gzhuli 咕唧霖
顶一个,很早已经拿ST的三合一板当USB-CDC用了。
----------------------------------------------------
原装的例程中其实有很大的 bug , 这个程序是经过我们将近一年测试下来比较可靠的程序. 【3楼】 lvhaian 安哥
是的,结构性的bug,对缓冲区处理极其不严谨,会丢字符……
像水猫说的:真怀疑ST有没有合格的软件工程师供职。 像水猫说的:真怀疑ST有没有合格的软件工程师供职。
---------------------------------------------
这个我倒是不太赞同:
其实通过 ST 的一些例子可以看到其实 ST 的软件工程师的实力是相当高的.
我觉得他放出这个 bug 代码是故意的. 只是起到一个抛砖引玉的作用. 兼容性怎么样,工控自动化行业里面很多走232通讯的,协议都非常底层,这方面有测试过吗 【2楼】 gongnn 魔法师
有价格优势?
------------------------
没有价格优势, 毕竟和那些专用芯片比起来价格肯定高了.
这个只是一个兴趣产品.
不过可以利用这个东西完全可以集成到你的系统中.
比如你原来你的系统是串口的, 其实完全不必修改原来的 PC 上的程序, 直接把你硬件的 USB 引出来, 把我上面发出来的代码稍许修改下集成到你的系统中可以做到最简单的方式升级到 USB 通讯. 【6楼】 breight
兼容性怎么样,工控自动化行业里面很多走232通讯的,协议都非常底层,这方面有测试过吗
我不知道您说的兼容性指的是什么, 是指在不同的 PC 上么?
通过我大量试验下来, 这个 USB 转 RS232 可以做到 CH431 的水平. 都是使用的 CDC 协议.
FT232BM 性能确实要强大一些, 那个是 FDTI 公司自己写的 WindowsXP 中的驱动, 缓存也做的比较大, 所以性能才更加好, 我之所以开源这个东西, 其实也希望一些 PC 端驱动写的比较好的朋友一起加入进来, 争取赶上 FDTI 公司的 FT232BM. 顶顶顶,估计要用到,,谢谢 请问安哥,那个壳子哪里有得买呀? 这个要mark一下。 【10楼】 STM32_Study
请问安哥,那个壳子哪里有得买呀?
--------------------------
这个盒子确实不好买, 我也是托关系才弄了 200 个, 不过价格很高.
需要的话我可以原价转给你. 带外壳, 包装, 线 8 元每个. 买来就是这个价格啊. 如果嫌价格高, 你只能另想办法了. 顶,谢谢安哥提供这样一个好东西 鼠标不错,要是没尾巴就更好了。 mark mark一下 mark mark一下~安哥太强了~
希望能出个uc/gui的移植教程~看起来太费劲了~ 好 【12楼】 lvhaian 安哥
谢谢安哥,目前产品定位比较低,无法采用这个价位的外壳
我觉得如果外壳价格这么高的话,如果没有大批量,不如买阿莫的一台雕刻机,自己买一些标准壳来开孔做外壳。 不客气那 , ^_^!!
这个东西实际价格应该很便宜, 不过我觉得没有途径我们买不到而已 呵呵 好东西,呵呵 【18楼】 cinderellah
希望能出个uc/gui的移植教程~看起来太费劲了~
---------------------------
其实移植只需要两个函数就可以了
读点函数和写点函数.
不过说上去简单 实际就没有那么容易了. 得抽空啊. 顶 不错,有机会做个用用 我之前在朋友帮忙下用MC908JB8JDW做了一个,本来也是改造产品为USB转串口的,
但有些程序兼容性不好,就一直没有用起来。 好贴,资料够全,学习USB的好例子! 留个名,有空好好学学 关注安哥。 mark 请教安哥
刚刚看了一下代码,有几个问题,请安哥指点
【一】buf_usb_to_uart 这个队列实际是没有使用的,是吧?
【二】另外,开USART_IT_TXE这个中断的用意是什么呢?这个应该也是没有用到的吧?
【三】两个队列写满以后调用的QueueWriteFull,这是不是一个Bug?
QueueWriteFull 里面的功能是针对 USB To UART的?实际上只有 buf_uart_to_usb 队列才用到了呀?
我猜想,这个功能之所以没有出错,是因为实际上UART的速度远远小于USB的速度,不会出现队列写满的情况? 顶一顶,请安哥有空来看看 强帖留名…… 顶一个,以后会用得着。 【32楼】 STM32_Study
-------------------------------
看的好仔细啊, ^_^!!
程序是虫子改进的, 我把虫子的理由给你说一下.
【一】buf_usb_to_uart 这个队列实际是没有使用的,是吧?
--------------------------------------------------------
最开始我让虫子开了两个队列, 是因为实际上 UART 的速度远远小于 USB 的速度,不会出现队列写满的情况.
所以虫子改进的时候把这个队列去了.
【二】另外,开USART_IT_TXE这个中断的用意是什么呢?这个应该也是没有用到的吧?
---------------------------------------------------------
之前是用到了当队列满的时候会使用中断发送出去, 现在确实是使用扫描发送出去的.
【三】两个队列写满以后调用的QueueWriteFull,这是不是一个Bug?
QueueWriteFull 里面的功能是针对 USB To UART的?实际上只有 buf_uart_to_usb 队列才用到了呀?
我猜想,这个功能之所以没有出错,是因为实际上UART的速度远远小于USB的速度,不会出现队列写满的情况?
------------------------------------------------------
你说的没有错, 已经把 buf_usb_to_uart 这个给去了, 所以确实这个写满已经没有用到了.
=======================================================
总而言之: 你真仔细. 顶一个,多谢安哥! 谢谢安哥~~~
继续请教一些问题哈
我尝试修改程序,将STM32串口接收改成从FLASH中读取数据,然后通过USB发送到PC
这样的结果是丁丁的SSCOM32顶不住,一开就死,数据量太大了,用系统自带的超级终端就没有问题,我猜这个问题应该是USB的驱动造成的?从STM32 USB 到PC USB这里并没有按照设定的串口速率才传输的,而是以最大速度传输的?
另外一个问题是,我看到SSCOM在发送数据的时候,一次是发送256个字节,但在STM32 的USB参数设置里面,BUFFER的大小是设置为64字节的,这个会有冲突吗?我不懂USB通讯,这个问题可能有些RZ哈…… 丁丁的SSCOM32顶不住
准确的说这个软件性能不好, ^_^
我也试验过数据量大的时候, 还有开两个的时候这个软件会死机. 肯定么超级终端稳定.
你可以用这个看看
点击此处下载 ourdev_508107.rar(文件大小:114K) (原文件名:串口调试助手V2.2.rar)
不过这个软件虽然通信好点, 但是什么起始位 停止位都是形同虚设, 而且串口只能选 4 个. 也很垃圾. 安哥~
我刚刚试了 串口调试助手 V2.2 ,更不行呀,久违的电脑蓝屏都出来了
使用机器真串口发送是没有问题
使用USB模拟串口,选择发送文件,我选择了一个800Kbyte大小的文件,选择16进制发送
一点击发送就蓝屏了……
看来小小的串口调试软件里面都有大技术呀,关于计算机串口的软件,微软的功力还是无人可及的。超级终端咋就这么稳定呢?
可惜超级终端功能用来调试单片机不合适,无法显示HEX,无法按HEX发送字符和文件…… 哦 ^_^, 大量数据和串口的驱动有关的
毕竟超级终端 微软自己编写的.
不过超级终端是超级稳定. 他的几个协议也是超级稳定. 新的一天又开始啦
继续研究 STM32 USB CDC
代码中,使用了Queue中间件
对于Queue的数据结构,我有一点疑问
在QueueCreate函数中,读取空处理和写满处理的声明是这样的:
uint8_t (* ReadEmpty)()
uint8_t (* WriteFull)()
但具体的调用的格式是这样的:
err = Queue->ReadEmpty(Ret, Queue);
err = Queue->WriteFull(Queue, Data, Q_WRITE_MODE);
实际的函数声明是这样的:
u8 QueueWriteFull(DataQueue *Buf, QUEUE_DATA_TYPE Data, u8 Mod)
这样不会出错吗?好像实际编译并没有报错?
函数指针的形参不一致也可以调用的吗? 跟着学习 跟着学习 安哥,可以用一片这个虚拟几个串口吗?比如C6T6有3个硬串口,我们可以虚拟出3个出来吗?
还有好象STM32里没有全串口,在用那些无源232转485的时候好象会有问题. 先谢谢,估计以后会用到 【43楼】 STM32_Study
这几天实在没有时间看这个, 过几天一起讨论.
【46楼】 lusson
这个问题我之前就考虑过, 不过很可惜是不可行的, 除非像FT232 芯片那家公司一样自己写 windows 驱动.
我之前想的最简单的方法就是用个 usb hub 芯片 加四片 STM32F103C6T6 .
现在才明白还是有问题的. windows 会崩溃的, 好久不见的 XP下的蓝屏. 这个要做,顶楼主 /* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 这一句改成上拉好些,要不然用手摸到Rx脚都会有数据。
GPIO_Init(GPIOA, &GPIO_InitStructure); 可以买吗?可以下载调试程序吗?谢谢 【50楼】 eiglxl
谢谢你的建议, 我修改掉.
【51楼】 yemingxp
可以购买, 我的淘宝店就有. 顶一个 usb转串口死机我也遇到
不过我的是电脑直接重启
现象是用我自己编写的串口调试软件,用usb转串口,不论波特率多少,也不是收到很多数,开始收数后大概2,3秒后电脑重启,如果打开了串口但没有收到数据,多长时间也不重启
还有一个用labview编的串口程序也是同样的现象
但是用丁丁的软件没问题
用原生串口就都没问题
我的软件是用api操作的串口,因为控件太慢了 做了些小动作,只是把USBEN的引脚修改了一下,并且对芯片的型号修改了一下,就能在万利的板子上运行了 谢谢安哥
点击此处下载 ourdev_509227.rar(文件大小:2.49M) (原文件名:Virtual_COM_Port.rar) 【55楼】 ilan2003 小松工程
不客气 老前辈. MARK 好东西,马上试试 现在遇到了一个新问题:
当PC USB传输过来的数据需要较长时间进行处理的时候,如果等处理完再将USB端口置为有效,会导致PC端大部分串口程序都响应不过来,可能是线程阻塞了?
如果是接收到数据,使用队列FIFO缓冲,直接将USB端口置为有效,然后再处理数据,这样会造成数据包可能丢失
因为USB置为有效以后,PC马上又发下一个数据包了……
我看了一下,USB批量传输是有NAK机制的,就是如果从器件太忙了,暂时没有能力接收数据,就可以发NAK包,主机收到后,就会等一段时间再重新发
STM32的USB库带了这个机制吗??在这个范例中是否有实现这个? 小麦,不错啊,东西,呵呵。 回去试试万利的板子 顶顶 波特率可以上到115200吗
ft232 上到38400就会有问题 可以啊 , 我现在就是使用 115200 波特率 汗一个···
好久没来了···
呵呵 都忘记了这个程序回复【59楼】STM32_Study
现在遇到了一个新问题:
当PC USB传输过来的数据需要较长时间进行处理的时候,如果等处理完再将USB端口置为有效,会导致PC端大部分串口程序都响应不过来,可能是线程阻塞了?
如果是接收到数据,使用队列FIFO缓冲,直接将USB端口置为有效,然后再处理数据,这样会造成数据包可能丢失
因为USB置为有效以后,PC马上又发下一个数据包了……
我看了一下,USB批量传输是有NAK机制的,就是如果从器件太忙了,暂时没有能力接收数据,就可以发NAK包,主机收到后,就会等一段时间再重新发
STM32的USB库带了这个机制吗??在这个范例中是否有实现这个?
-----------------------------------------------------------------------
汗一个
好久没来了
都忘记这个程序的内容了
当PC USB传输过来的数据需要较长时间进行处理的时候,如果等处理完再将USB端口置为有效,会导致PC端大部分串口程序都响应不过来,可能是线程阻塞了?
太长时间是不行的 但是 如果是两边同样的波特率转发 这个等待时间是绝对不会死掉的
如果是接收到数据,使用队列FIFO缓冲,直接将USB端口置为有效,然后再处理数据,这样会造成数据包可能丢失
USB的速率相对UART来说 快太多了 您说的是用队列FIFO缓冲吧? 那就是用ram之前用过这个方式 但是不行的
ram最大就20K 文件大的话FIFO也撑爆啊
我看了一下,USB批量传输是有NAK机制的,就是如果从器件太忙了,暂时没有能力接收数据,就可以发NAK包,主机收到后,就会等一段时间再重新发
STM32的USB库带了这个机制吗??在这个范例中是否有实现这个?
这个就真的忘记了 丢下太久了
但是库里面是有NAK协议包的 貌似我只是用了 端口 有效无效 没有用NAK
用NAK应该是可以的 但是 不知道一直的发NAK会不会也有一个最大次数限制 不错,记号。 make 已经做好,在测试中。 mark appwiz.cpl HEX发送:11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
HEX接收到:11 22 33 44 55 66 77 08 19 2A 3B 4C 5D 6E 7F
是什么问题?有事过的吗 非常好 mark 顶一下。 mark remark mark 【71楼】 disheng
这个问题比较有意思, 我看看. 回复【楼主位】lvhaian 安哥
-----------------------------------------------------------------------
mark 回复【65楼】litteworm
-----------------------------------------------------------------------
谢谢 litteworm~
我也一直没解决这个问题,后来我是在上位机自己写了一个简易的串口程序,直接延时发送来解决这个问题的。手法很粗糙
你要是有时间的话,看看能否改进一下这个STM32 虚拟串口程序?使得大批量数据处理的时候,上位机能够等待…… hh USB2UART越来越常见了…… 有没有USB转并口?? 不错。。。。。 mark 请问USB 的虚拟串口能够达到 USB2.0的全速 12Mbps 吗?
硬件肯定没问题,但是上位机虚拟串口驱动怎么办呢?
下位机的USB怎样设置串口的波特率? mark mark 顶顶顶 测试有些问题,请看图 http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_546869.JPG
(原文件名:测试.JPG) 查找原因当中..... 做成的转接器 联JTAGICE不能用 Mark 很精巧的小东西........顶把 mark 好帖收藏 调试的时候出现一个问题,从com发送汉字时,收到的是乱码,其他各种情况都没有问题。
小弟愚笨,找不到原因,疑惑中,望高人指点,谢谢。 mark 回复【83楼】ammcu
-----------------------------------------------------------------------
341可以转并口的 mark