OpenEdv-开源电子网

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

修改原子个USB串口协议失败了,求帮助

[复制链接]

15

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
274
金钱
274
注册时间
2016-7-15
在线时间
88 小时
发表于 2016-12-12 11:11:11 | 显示全部楼层 |阅读模式
10金钱
void USB_To_USART_Send_Data(u8* data_buffer, u8 Nb_bytes)
{
        u8 i;
        u8 res;
        for(i=0;i<Nb_bytes;i++)
        {  
                res=data_buffer[i];
                if((USB_USART_RX_STA&0x8000)==0)                //&#189;óê&#213;&#206;′íê3é
                {
                        if(USB_USART_RX_STA&0x4000)                        //&#189;óê&#213;μ&#189;á&#203;0x0d
                        {
                                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;
                        }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;       
                                }                                       
                        }
                }   
        }  
}

看了原子哥的串口实验,现在改写他的USB虚拟串口实验,去掉0X0A 0X0D结尾的协议,就是收到一个数字01不打回车换行就能直接控制IO口输出高低电平。我串口的改成功了,可是USB的不知道怎么改。我把判断结尾是不是0X0A 0X0D if语句去掉!我打01  IO口都不听话了!求帮助啊,新手。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-12-12 11:35:09 | 显示全部楼层
大概明白楼主的意思,楼主应该是需要一个判断串口接收结束的标志,可以考虑用串口接收超时来做,比较简单。
规定一个时间,比如10ms,串口接收到数据以后,打开定时器。
如果大于10ms,串口没能接收到下一位数据数据,就说明本次数据接收结束。
具体过程,楼主可以百度一下串口超时判断等等。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

15

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
274
金钱
274
注册时间
2016-7-15
在线时间
88 小时
 楼主| 发表于 2016-12-12 11:38:08 | 显示全部楼层
东北小辉辉 发表于 2016-12-12 11:35
大概明白楼主的意思,楼主应该是需要一个判断串口接收结束的标志,可以考虑用串口接收超时来做,比较简单。 ...

非常感谢
回复

使用道具 举报

13

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-11-16
在线时间
21 小时
发表于 2016-12-12 13:13:38 | 显示全部楼层
东北小辉辉 发表于 2016-12-12 11:35
大概明白楼主的意思,楼主应该是需要一个判断串口接收结束的标志,可以考虑用串口接收超时来做,比较简单。 ...

直接用软件延时,。在延时里查询是否有数据接收,有则重新刷新延时时间,没有延时完成就退出 ???
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-12-12 14:15:14 | 显示全部楼层
萝卜头 发表于 2016-12-12 13:13
直接用软件延时,。在延时里查询是否有数据接收,有则重新刷新延时时间,没有延时完成就退出 ???

不知道您说的软件延时是什么意思? 大致想了一下思路,应该是这样的
void uart_isr( void )
{
    打开10ms定时器
    10msTimerCnt = 0
    将数据存进buffer
}
void 10mstimer_isr( void )
{
    SendMessage    //发送串口接收完成消息
    关闭10ms定时器
}

int main( )
{
    while( 1 )
    {
        Message_Handler();        //处理消息
        ...
    }
    return 0
}
具体超时时间,设置成多少,也要根据波特率来进行设定。原子哥的GPS模块例程中,好像也有串口超时的操作。
有什么问题,还请及时讨论。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-12-12 14:27:27 | 显示全部楼层
另外,不是很明白楼主标题写的“USB串口协议”是什么意思,USB就是USB,串口就是串口,怎么会搞混呢。
USB有CDC类,就是虚拟串口的类。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-12-12 18:18:04 | 显示全部楼层
仿真分析下,就容易找到问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 02:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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