OpenEdv-开源电子网

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

两块战舰板子,用串口通信,一块为上位机,一块为下位机!

[复制链接]

14

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-9-27
在线时间
43 小时
发表于 2016-11-25 20:04:34 | 显示全部楼层 |阅读模式
2金钱
上位机的USART1_TX连接下位机的USART1_RX引脚,下位机的USART1_TX连接上位机的USART1_RX引脚,
两块板子GND相连!为什么不能控制!就是一个简单的上位机控制下位机点灯的实验!


上位机:
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "beep.h"
#include "usart.h"
#include "key.h"


int main(void)
{
        u8 key=0;
       
        LED_Init();
        delay_init();
        KEY_Init();
        BEEP_Init();
        uart_init(115200);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
        while(1)
        {
                key=KEY_Scan(0);
                {
                        if(key==1)
                        {
                                USART_SendData(USART1,1);//Ïò′®¿ú1·¢Ëíêy¾Y       
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//μè′y·¢Ëí½áêø
                        }
                       
                        else if(key==2)
                        {
                                USART_SendData(USART1,2);//Ïò′®¿ú1·¢Ëíêy¾Y       
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//μè′y·¢Ëí½áêø
                        }

                        else if(key==4)
                        {
                                USART_SendData(USART1,3);//Ïò′®¿ú1·¢Ëíêy¾Y       
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//μè′y·¢Ëí½áêø
                        }
                }
        }       
}

下位机
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "beep.h"
#include "usart.h"
int main(void)
{
        u16 t;  
        u8 a;
        u16 len;
        LED_Init();
        delay_init();
        BEEP_Init();
        uart_init(115200);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       
        while(1)
        {       
                if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;//μÃμ½′Ë′νóêÕμ½μÄêy¾Y3¤¶è
                        for(t=0;t<len;t++)
                        {
                                a=USART_RX_BUF[t];
                                if(a==1)
                                {
                                        LED0=0;
                                }
                                if(a==2)
                                {
                                        LED1=0;
                                }       
                                if(a==3)
                                {
                                        LED0=1;
                                        LED1=1;
                                }
                                if(a==4)
                                {
                                        LED0=0;
                                        LED1=0;
                                }       
                        }
                        USART_RX_STA=0;
                }
        }       
}



用串口调试助手,完全没问题!大神求解!

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

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
发表于 2016-11-25 20:19:52 | 显示全部楼层
很有可能是下位机的缓冲区有问题。当下位机所申请的缓冲不够大,就会造成覆盖现象了,而使用串口助手时不存在这个问题。还有,你是用按键控制的吧?为什么没有防抖呢?这样很容易你只按一次,下位机却检测到了好多次,造成了收到的指令流过大而溢出接收缓冲区,导致后面的取指失败,这也是有可能滴
回复

使用道具 举报

14

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-9-27
在线时间
43 小时
 楼主| 发表于 2016-11-25 20:24:42 | 显示全部楼层
尼斯达 发表于 2016-11-25 20:19
很有可能是下位机的缓冲区有问题。当下位机所申请的缓冲不够大,就会造成覆盖现象了,而使用串口助手时不存 ...

缓冲够大了,毕竟就发一个数字。按键的话,不是主要的原因吧,因为我一次都没成功,肯定不是消抖的原因!
回复

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
发表于 2016-11-25 20:47:45 | 显示全部楼层
ken233333 发表于 2016-11-25 20:24
缓冲够大了,毕竟就发一个数字。按键的话,不是主要的原因吧,因为我一次都没成功,肯定不是消抖的原因!

你是用XCOM下看到,有发送一大串的1或2或3吗?
回复

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
发表于 2016-11-25 20:48:36 | 显示全部楼层
ken233333 发表于 2016-11-25 20:24
缓冲够大了,毕竟就发一个数字。按键的话,不是主要的原因吧,因为我一次都没成功,肯定不是消抖的原因!

这些1、2、3是连着的还是分隔开来的?
回复

使用道具 举报

14

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-9-27
在线时间
43 小时
 楼主| 发表于 2016-11-25 20:50:38 | 显示全部楼层
尼斯达 发表于 2016-11-25 20:48
这些1、2、3是连着的还是分隔开来的?

按键按一次,基本上都是独立的一个一个数字,是分开的!
回复

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
发表于 2016-11-25 20:54:07 | 显示全部楼层
ken233333 发表于 2016-11-25 20:50
按键按一次,基本上都是独立的一个一个数字,是分开的!

你不懂我的意思,算了,直接问你,你有没有勾选XCOM里的以16进制形式显示选项?
回复

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
发表于 2016-11-25 21:01:09 | 显示全部楼层
我大概知道你的问题在哪了,你是没有搞清楚数字、整数和ASCII的区别
回复

使用道具 举报

14

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-9-27
在线时间
43 小时
 楼主| 发表于 2016-11-25 21:05:52 | 显示全部楼层
我两边都是设置的16进制数的,你看看我两个程序应该都是16进制的吧!
回复

使用道具 举报

14

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-9-27
在线时间
43 小时
 楼主| 发表于 2016-11-25 21:06:45 | 显示全部楼层
尼斯达 发表于 2016-11-25 20:54
你不懂我的意思,算了,直接问你,你有没有勾选XCOM里的以16进制形式显示选项?

我勾了16进制显示,我也是按照16进制发送的
回复

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
发表于 2016-11-25 21:08:18 | 显示全部楼层
USART是以ASCII码形式发送,而不是我们所想的整数。你看看把下位机的检测改成0x31、0x32、0x33看看
回复

使用道具 举报

14

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-9-27
在线时间
43 小时
 楼主| 发表于 2016-11-25 21:19:01 | 显示全部楼层
尼斯达 发表于 2016-11-25 21:08
USART是以ASCII码形式发送,而不是我们所想的整数。你看看把下位机的检测改成0x31、0x32、0x33看看

上位机:
key=KEY_Scan(0);
                {
                        if(key==1)
                        {
                                USART_SendData(USART1,1);
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        }
                       
                        else if(key==2)
                        {
                                USART_SendData(USART1,2);
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        }

                        else if(key==4)
                        {
                                USART_SendData(USART1,3);
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        }
                }

下位机:
if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;
                        for(t=0;t<len;t++)
                        {
                                a=USART_RX_BUF[t];
                                if(a==0x31)
                                {
                                        LED0=0;
                                }
                                if(a==0x32)
                                {
                                        LED1=0;
                                }       
                                if(a==0x33)
                                {
                                        LED0=1;
                                        LED1=1;
                                }
                                if(a==0x34)
                                {
                                        LED0=0;
                                        LED1=0;
                                }       
                        }
                        USART_RX_STA=0;
                }


还是不行!
回复

使用道具 举报

14

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-9-27
在线时间
43 小时
 楼主| 发表于 2016-11-25 21:20:15 | 显示全部楼层
尼斯达 发表于 2016-11-25 21:08
USART是以ASCII码形式发送,而不是我们所想的整数。你看看把下位机的检测改成0x31、0x32、0x33看看

上位机:
key=KEY_Scan(0);
                {
                        if(key==1)
                        {
                                USART_SendData(USART1,0x31);
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        }
                       
                        else if(key==2)
                        {
                                USART_SendData(USART1,0x32);
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        }

                        else if(key==4)
                        {
                                USART_SendData(USART1,0x33);
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        }
                }

下位机:
if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;
                        for(t=0;t<len;t++)
                        {
                                a=USART_RX_BUF[t];
                                if(a==0x31)
                                {
                                        LED0=0;
                                }
                                if(a==0x32)
                                {
                                        LED1=0;
                                }       
                                if(a==0x33)
                                {
                                        LED0=1;
                                        LED1=1;
                                }
                                if(a==0x34)
                                {
                                        LED0=0;
                                        LED1=0;
                                }       
                        }
                        USART_RX_STA=0;
                }


也不行!!
回复

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
发表于 2016-11-25 21:26:16 | 显示全部楼层
ken233333 发表于 2016-11-25 21:19
上位机:
key=KEY_Scan(0);
                {

这就不清楚了。。。闪太快看不见?哈哈,试试每一个加50ms看看有没效果咯,程序上貌似没什么大问题
回复

使用道具 举报

14

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2016-9-27
在线时间
43 小时
 楼主| 发表于 2016-11-25 21:28:42 | 显示全部楼层
尼斯达 发表于 2016-11-25 21:26
这就不清楚了。。。闪太快看不见?哈哈,试试每一个加50ms看看有没效果咯,程序上貌似没什么大问题

,应该不会吧。我用xcom都是正常的呢。虽然还是没有调试出来,但是还是要谢谢你
回复

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
发表于 2016-11-25 21:35:25 | 显示全部楼层
ken233333 发表于 2016-11-25 21:28
,应该不会吧。我用xcom都是正常的呢。虽然还是没有调试出来,但是还是要谢谢你

哈哈,客气啦。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-29 02:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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