OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3853|回复: 3

STM32 F4虚拟串口相关

[复制链接]

12

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-2-28
在线时间
23 小时
发表于 2018-8-13 17:33:01 | 显示全部楼层 |阅读模式
2金钱
      最新本人有个项目用到USB的虚拟串口,并且MCU已经选择好是F4系列的。      在板子发出去加工这段时间,我就拿F103的战舰板进行调试,DEMO是原子哥的虚拟串口驱动程序,在这里我
就碰到了几个问题。
      问题:在程序中有个变量叫USB_USART_RX_STA。BIT15是接收完成标志,BIT14的接收到0x0d标志。这个标志
位是根据数据是否是0x0d,0x0a进行置位。但是问题来了,为什么标志1这里就能判断出接收到了0x0d,然后我把整个工程里面
搜了一下0x0d,判断等于0x0d的进行置位的,没有找到。
    这个量程是把0x0d,0x0a作为结束符,然后对接收到数据进行打印.。我的问题是0x0d,0x0a是如何触发标志位的!
     后来我仔细一想,F1的虚拟串口驱动和F4的虚拟串口程序能相互移植吗?搜了一圈,貌似是不能的!那我这时候把F1的调试出来
有毛用?去网上搜了一圈,貌似是有点区别的请问各位仁兄有F4系列的虚拟串口实验的文档和例程(我去原子哥的F429和F407盘里找了
没找到相关教程)发上来分享学习一下。
    另外,在F1的USB里,DP是需要电阻进行上拉的。而F4的USB接口,直接接上去就可以。
    反正,我觉得USB虚拟串口还真的有点麻烦,想要真正理解还要花点功夫。

[mw_shl_code=applescript,true]for(i=0;i<Nb_bytes;i++)
        {  
                res=data_buffer;
                if((USB_USART_RX_STA&0x8000)==0) //接收未完成
                {
                        if(USB_USART_RX_STA&0x4000)                        //接收到了0x0d,标志1
                        {if(res!=0x0a)USB_USART_RX_STA=0;//&#189;óê&#213;′í&#206;ó,&#214;&#216;D&#194;&#191;aê&#188;
else USB_USART_RX_STA|=0x8000;        //&#189;óê&#213;íê3éá&#203;,&#189;óê&#213;±ê&#214;&#190;&#206;&#187;&#214;&#195;&#206;a1

                        }
                        else //&#187;1&#195;&#187;ê&#213;μ&#189;0X0D
                        {       
                                if(res==0x0d)USB_USART_RX_STA|=0x4000;
                                else
                                {
                                        USB_USART_RX_BUF[USB_USART_RX_STA&0X3FFF]=res;
                                        USB_USART_RX_STA++;
                                        if(USB_USART_RX_STA>(USB_USART_REC_LEN-1))USB_USART_RX_STA=0;//&#189;óê&#213;êy&#190;Y′í&#206;ó,&#214;&#216;D&#194;&#191;aê&#188;&#189;óê&#213;       
                                }                                       
                        }
                }
        }  [/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

1.其实你贴的代码已经告诉了这个问题的答案:为什么标志1这里就能判断出接收到了0x0d?重点注意这几处 2. “我的问题是0x0d,0x0a是如何触发标志位的[/backcolor]”当你使用串口助手来做这个例程测试的时候要勾选“发送新行的”当你发送数据给板子的时候 ,经过USB虚拟串口就会收到0x0d 0x0a
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10571
金钱
10571
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-8-13 17:33:02 | 显示全部楼层
本帖最后由 peng1554 于 2018-8-13 18:33 编辑

1.其实你贴的代码已经告诉了这个问题的答案:为什么标志1这里就能判断出接收到了0x0d?重点注意这几处                                                        2. “我的问题是0x0d,0x0a是如何触发标志位的”当你使用串口助手来做这个例程测试的时候要勾选“发送新行的”当你发送数据给板子的时候 ,经过USB虚拟串口就会收到0x0d 0x0a



1.JPG
2.JPG
回复

使用道具 举报

12

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-2-28
在线时间
23 小时
 楼主| 发表于 2018-8-13 19:09:38 | 显示全部楼层
peng1554 发表于 2018-8-13 18:27
1.其实你贴的代码已经告诉了这个问题的答案:为什么标志1这里就能判断出接收到了0x0d?重点注意这几处      ...

一般串口调试助手里面加回车换行就是发数据时自带\r\n,然后在else里面,USB_USART_RX_STA这个变量有运算(自加),然后向上程序触发了。其实我现在算是明白了,USB_USART_RX_STA高两位来做标志位,下面的位来做数据长度。
关于结束符的话如果不是\r\n我自行在这个数据处理函数里面做改动即可。
那么我还有个问题?
1.另外F1的VCP程序好移植到F4的VCP上面去吗?是不是F1的USB库和F4的USB库根本不一样?

其实这里面的细节不经你提醒,我还真没看出来,多谢。
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10571
金钱
10571
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-8-13 19:24:44 | 显示全部楼层
JQChris 发表于 2018-8-13 19:09
一般串口调试助手里面加回车换行就是发数据时自带\r\n,然后在else里面,USB_USART_RX_STA这个变量有运算 ...

没移植过了,不好说另外
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 20:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表