OpenEdv-开源电子网

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

关于USART通信问题

[复制链接]

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2017-11-2
在线时间
7 小时
发表于 2017-12-18 16:37:24 | 显示全部楼层 |阅读模式
1金钱
原子哥您好,我用的是战舰开发板。
新人有个疑问,就是在做USART测试实验的时候,想提取USART_ReceiveData中数据,做一个控制LED0和LED1的程序。a=USART_REF();
switch(a)
{
  case 1:
   LE0=!LED0;
   LED1=!LED1;
case 2:
    LED0=0;
    LED1=1;
case 3:
    LED0=1;
    LED1=0;
}



其中USART_REF()为
USART_REF()
{
  u16 REF;
  REF=USART_ReceiveData(USART1);
到这就卡住了,因为之前C语言没怎么学过,基本都是一边看例程一边学的,不知道在DR寄存器中数据是怎么个存储形式,判断函数也没想好怎么弄,是定义一个数组来存储最后比较字符串,还是直接把每个位存进行判断,那样是不是在串口输入命令的时候,只能输入16位,两字节的数了。在这可能是我学C和学STM32交汇的盲点,非常迷糊了。虽然问题很初级,希望大大解答。

最佳答案

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

结束符,不是介绍符,写错了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-5-26
在线时间
10 小时
发表于 2017-12-18 16:37:25 | 显示全部楼层
不玩恒心 发表于 2017-12-18 16:44
首先串口收到一个字节是字符串,后面有介绍符,switch语句无法判断字符串,只能判断数字或字母。可以试着将 ...

结束符,不是介绍符,写错了
回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2017-11-2
在线时间
7 小时
 楼主| 发表于 2017-12-18 16:43:57 | 显示全部楼层
还有就是我程序中每个switch中有break的。刚才没注意。忘记写了
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-5-26
在线时间
10 小时
发表于 2017-12-18 16:44:07 | 显示全部楼层
首先串口收到一个字节是字符串,后面有介绍符,switch语句无法判断字符串,只能判断数字或字母。可以试着将switch改为if,else if,用memcmp判断是否与你的获取的字符串一样。
回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2017-11-2
在线时间
7 小时
 楼主| 发表于 2017-12-18 16:48:05 | 显示全部楼层
不玩恒心 发表于 2017-12-18 16:44
首先串口收到一个字节是字符串,后面有介绍符,switch语句无法判断字符串,只能判断数字或字母。可以试着将 ...

这个我是知道的,因此我用一个变量a来给switch判断,之后通过一个函数来控制这个变量a。我想知道,一般判断来说,解算串口数据的方式是什么?直接将串口数据存到字符串里,之后调用每个位的数据?还是直接用C中的办法,将每个字节的数据拉出来比较久可以。谢谢您的回答。
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-5-26
在线时间
10 小时
发表于 2017-12-18 16:52:28 | 显示全部楼层
ttjaliy 发表于 2017-12-18 16:48
这个我是知道的,因此我用一个变量a来给switch判断,之后通过一个函数来控制这个变量a。我想知道,一般判 ...

不知道你a的类型定义的是什么,按照你的switch的判断,应该为int类型,串口数据类型是char指针类型,还有你可以debug看一下a的值是什么,或者打印一下a的值,是否正确,才用switch去判断。
回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2017-11-2
在线时间
7 小时
 楼主| 发表于 2017-12-18 16:52:38 | 显示全部楼层
不玩恒心 发表于 2017-12-18 16:46
结束符,不是介绍符,写错了

好的,那我先存到字符串里,之后通过结束符判断数据接收完成,之后再比较字符串数据就可以了是吧。
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-5-26
在线时间
10 小时
发表于 2017-12-18 16:55:02 | 显示全部楼层
ttjaliy 发表于 2017-12-18 16:52
好的,那我先存到字符串里,之后通过结束符判断数据接收完成,之后再比较字符串数据就可以了是吧。

是的!!!!!!!
回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2017-11-2
在线时间
7 小时
 楼主| 发表于 2017-12-18 17:04:48 | 显示全部楼层
不玩恒心 发表于 2017-12-18 16:55
是的!!!!!!!

谢谢啦,其实关于a的类型我也有点纠结,因为C语言中a确实应该定义为int。但是根据misc.h里看完了之后,发现单片机中,好多数据直接看位和字节的。跟数据类型关系不大了。刚才脑子迷糊可能就是因为不知道串口通信中数据到底是什么类型。比如说我用串口发a值进来,实际是0110 0001,如果想用这个数据来判断一些东西,如果用位判断的话,那就得判断好多,或者直接对数据做一个0110 0001的&或者|的逻辑运算。但是,如果我想用mode1作为串口指令控制一些东西的话,就好麻烦。
回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2017-11-2
在线时间
7 小时
 楼主| 发表于 2017-12-19 16:58:00 | 显示全部楼层
想要的功能已经实现了。

#include <string.h>

char m[6];

m[t]=USART_RX_BUF[t];

if(strcmp(m,"MODE1")==0) a=1;

switch(a)
{ case 1:
  LED0=0;
  LED1=1;
  break;
}

写四个关键点纪念一下。哈
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-23 18:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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