OpenEdv-开源电子网

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

求助! 急!!!

[复制链接]

13

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2018-3-29
在线时间
17 小时
发表于 2018-8-14 13:41:36 | 显示全部楼层 |阅读模式
1金钱
我用stm32f103做了一个小车,串口1控制前进、后退、左、右,程序刚运行时(刚开机或复位)第一个指令能正常运行,第二次以后的指令前进和后退指令就没反应了,左和右正常。求大神指教,第一次用stm32做小车。下面附上一段小车控制的代码:
/******************停止**************************************/
void stop(void)
{
    Right1=0;  Right2=0;
    Left1=0;   Left2=0;
    TIM_SetCompare1(TIM3,0);       //ÓÒ
    TIM_SetCompare2(TIM3,0);         //×ó
}
/******************前进**************************************/
void forward(void)
{
    Right1=1;  Right2=0;
    Left1=1;   Left2=0;
    TIM_SetCompare1(TIM3,PW1);   
    TIM_SetCompare2(TIM3,PW2);
}
/******************后退**************************************/
void backward(void)
{
    Right1=0;  Right2=1;
    Left1=0;   Left2=1;
    TIM_SetCompare1(TIM3,PW1);   
    TIM_SetCompare2(TIM3,PW2);
}
/******************左*************************************/
void left(void)
{
    Right1=1;  Right2=0;
    Left1=0;   Left2=1;
    TIM_SetCompare1(TIM3,PW1);   
    TIM_SetCompare2(TIM3,PW2);
}
/******************右**************************************/
void right(void)
{
    Right1=0;  Right2=1;
    Left1=1;   Left2=0;
    TIM_SetCompare1(TIM3,PW1);   
    TIM_SetCompare2(TIM3,PW2);
}


最佳答案

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

不是的,那个是假象,strcpy它不会管你的字符串有多长,会一直比较到某个字符串中出现'\0'或者是两个字符串对应的字母不相等的时候。而你发回电脑显示,则使用了串口接收缓冲区的长度,发到电脑上的数据来看当然是正确的。 楼主不妨在完成每个字符串的判断,在完成flag的赋值后把flag中的数值通过串口输出。说不定会发现问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-14 13:41:37 | 显示全部楼层
CPU 发表于 2018-8-14 22:19
非常感谢,字符串接收应该是没问题的,因为每次接收到之后,我又发回电脑显示,是没有乱码的。接收都是正 ...

不是的,那个是假象,strcpy它不会管你的字符串有多长,会一直比较到某个字符串中出现'\0'或者是两个字符串对应的字母不相等的时候。而你发回电脑显示,则使用了串口接收缓冲区的长度,发到电脑上的数据来看当然是正确的。

楼主不妨在完成每个字符串的判断,在完成flag的赋值后把flag中的数值通过串口输出。说不定会发现问题。
十六进制带我飞。
回复

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
470
金钱
470
注册时间
2017-12-20
在线时间
61 小时
发表于 2018-8-14 14:13:51 | 显示全部楼层
已知代码看不出来啥
回复

使用道具 举报

13

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2018-3-29
在线时间
17 小时
 楼主| 发表于 2018-8-14 14:33:15 | 显示全部楼层
淡然若梦 发表于 2018-8-14 14:13
已知代码看不出来啥

if(USART_RX_STA&0x8000)
                {       
                        if(!(strcmp(USART_RX_BUF,"go")))          flag=1;
                        else if(!(strcmp(USART_RX_BUF,"back")))   flag=2;
                        else if(!(strcmp(USART_RX_BUF,"left")))          flag=3;
                        else if(!(strcmp(USART_RX_BUF,"right")))  flag=4;
                        else if(!(strcmp(USART_RX_BUF,"up")))  { PW1+=50;  PW2+=50; }
                        else if(!(strcmp(USART_RX_BUF,"down")))  { PW1-=50;  PW2-=50; }
                        else flag=5;
                       
                        len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
                        for(t=0;t<len;t++)
                        {
                                USART_SendData(USART1, USART_RX_BUF[t]);//&#207;ò&#180;&#174;&#191;&#218;1·&#162;&#203;&#205;&#202;&#253;&#190;&#221;
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//&#181;&#200;&#180;&#253;·&#162;&#203;&#205;&#189;á&#202;&#248;
                        }
                        printf("\r\n");//&#178;&#229;&#200;&#235;&#187;&#187;&#208;&#208;
                        USART_RX_STA=0;
                }

这是主程序中的调用,这之外还驱动了一个摄像头和一块LCD频幕
回复

使用道具 举报

13

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2018-3-29
在线时间
17 小时
 楼主| 发表于 2018-8-14 14:35:26 | 显示全部楼层
CPU 发表于 2018-8-14 14:33
if(USART_RX_STA&0x8000)
                {       
                        if(!(strcmp(USART_RX_BUF,"go")))          flag=1;

但这个问题在没有加摄像头之前就已经出现
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-14 20:46:50 | 显示全部楼层
本帖最后由 DreamWaterPro 于 2018-8-14 20:47 编辑

猜想可能是USART_RX_BUF中出现了数据覆盖但是又没有覆盖完全的情况,我记得正点原子给的程序不会在接收缓冲的末尾自动添加'\0'.例如第一次接收了back之后第二次接收到go,此USART_RX_BUF中的数据是这样的:
g o c k \0 \0 \0 ....
但是好像如果仅仅是这个问题的话,从目前楼主给出来的代码来看故障现象和楼主所描述的不符。

楼主可以试一试不使用字符串判断,直接通过判断USART_RX_BUF[0]是否为字母g b l r等等,来看看是否能够正常工作;如果不能,故障现象又有什么变化。
十六进制带我飞。
回复

使用道具 举报

13

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2018-3-29
在线时间
17 小时
 楼主| 发表于 2018-8-14 22:19:31 | 显示全部楼层
DreamWaterPro 发表于 2018-8-14 20:46
猜想可能是USART_RX_BUF中出现了数据覆盖但是又没有覆盖完全的情况,我记得正点原子给的程序不会在接收缓冲 ...

非常感谢,字符串接收应该是没问题的,因为每次接收到之后,我又发回电脑显示,是没有乱码的。接收都是正确的。还有没有其他可能呢?
回复

使用道具 举报

13

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2018-3-29
在线时间
17 小时
 楼主| 发表于 2018-8-15 10:23:56 | 显示全部楼层
DreamWaterPro 发表于 2018-8-14 13:41
不是的,那个是假象,strcpy它不会管你的字符串有多长,会一直比较到某个字符串中出现'\0'或者是两个字符 ...

非常感谢你,正像你所说的那样,前进后退和停止所返回的flag值是一样的,然后我在接收到的字符串后面都加一个'\0'之后就正常了
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-8-15 10:27:20 | 显示全部楼层
单步调试,看看每次串口BUF接收的数据是不是正确,然后在看字符串比较的结果是不是正确。或者是把发送的字符串改成数字试试,比如1代表前进,2代表后退。用数字测试正确的话,再换成字符串测试。
回复

使用道具 举报

13

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2018-3-29
在线时间
17 小时
 楼主| 发表于 2018-8-15 10:43:59 | 显示全部楼层
HXYDJ 发表于 2018-8-15 10:27
单步调试,看看每次串口BUF接收的数据是不是正确,然后在看字符串比较的结果是不是正确。或者是把发送的字 ...

嗯嗯,确实是字符串接收的问题,在楼上的指导下已经解决这个问题了,还是谢谢你
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 20:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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