OpenEdv-开源电子网

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

关于串口通信的几个问题

[复制链接]

4

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2018-9-23
在线时间
67 小时
发表于 2018-10-1 09:48:03 | 显示全部楼层 |阅读模式
10金钱
最近在看关于串口通信,困扰了我好几天的问题,对于串口通信这个概念还是很模糊,看了很多帖子还是没搞明白1.单片机每次进入中断接收的一组数据是一个字节吗?

2.用XCOM给单片机发送数据它是自动给数据加上0x0d0x0a结尾标志吗?单片机是怎样开始接收这组数据的?
3.我用原子的串口例程改编,想实现如下功能
1.  XCOM发送 ‘1’  LED0开 ,发送‘2’ LED0关
我的过程
我在中断服务函数里面判断接收到的是“1”,or '2'。  定义了两个变量如果是‘1’  flag0=1.如果是‘2’  flag1=1.
在主函数里面判断flag0 flag1的值,然后flag0 flag1置零,并对相应的引脚拉高\拉低电平
发现灯没反应,请问这是我的方法不对还是哪里出了问题





最佳答案

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

你把程序改写成这样试下,这下面输入1灯会亮 if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 printf("\r\n您发送的消息为:"); for(t=0;t
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-10-1 09:48:04 | 显示全部楼层
你把程序改写成这样试下,这下面输入1灯会亮
if(USART_RX_STA&0x8000)
        {                     
            len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
            printf("\r\n您发送的消息为:");
            for(t=0;t<len;t++)
            {
                USART_SendData(USART1, USART_RX_BUF[t]);         //向串口1发送数据
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
            }
            if(USART_RX_BUF[0]=='1')
            {        
               printf("\r\nLED1亮\r\n");
               LED1=0;
            }
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10571
金钱
10571
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-10-1 15:14:39 | 显示全部楼层
1.是
2.当XCOM勾选发送新行的时候发送的数据结尾就带有0x0d,0x0a.串口通信例程有接收中断,每次串口DR寄存器接收到1字节的数据就进入接收中断保存这1字节的数据 90.JPG
3.楼上的代码可以移植下
回复

使用道具 举报

4

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2018-9-23
在线时间
67 小时
 楼主| 发表于 2018-10-1 15:51:52 来自手机 | 显示全部楼层
1208 发表于 2018-10-1 11:23
你把程序改写成这样试下,这下面输入1灯会亮
if(USART_RX_STA&0x8000)
        {                     
...

嗯嗯  谢谢
回复

使用道具 举报

4

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2018-9-23
在线时间
67 小时
 楼主| 发表于 2018-10-1 15:52:33 来自手机 | 显示全部楼层
peng1554 发表于 2018-10-1 15:14
1.是
2.当XCOM勾选发送新行的时候发送的数据结尾就带有0x0d,0x0a.串口通信例程有接收中断,每次串口DR寄存 ...

好的  谢谢你
回复

使用道具 举报

7

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-4-3
在线时间
37 小时
发表于 2018-10-2 19:12:31 | 显示全部楼层
本帖最后由 jaems 于 2018-10-2 19:21 编辑

1.单片机每次进入中断接收的一组数据是一个字节吗?
答:每次单片机串口只要有数据就会触发串口中断,所以接收到的是一位,你用仿真调试在这里下断点就知道了,  比如电脑发送EF 单片机收到E就触发中断(这里也不绝,但是绝大部分的都是这样) 然后F到达再次触发串口中断
2.用XCOM给单片机发送数据它是自动给数据加上0x0d0x0a结尾标志吗?单片机是怎样开始接收这组数据的?
答:如上图原子哥的 xcom 需要勾选发送新行,救会自动添加在结尾处。 这是原子哥故意添加的结束标志位,不是所有的都这样,要看对应的单片机串口中断函数怎么写。 串口中断是属于硬件所支持的功能,就是硬件串口接受
       到数据就会自动触发调用串口中断程序。没什么好讲的。除非你是硬件工程师,要弄懂芯片是怎么触发串口中断的原理,这也不是你新手能马上就理解的,需要对硬件相当熟悉。
3.我用原子的串口例程改编,想实现如下功能
答:串口发送1 /0 开关led 是可以的,你没有触发是因为编码,你在电脑上发送 EF 并不是串口中断里收到的就是EF 应该是经过底层编码的,电脑会把EF 编码然后再发送,单片机接受到后根据同样的编码规则还原编码为上层的EF,一般应该都是ASCII 编码,需要还原,或        者直接对比底层编码比如发送E  串口中断收到的是0x45 (0x45 是大写E 的ASCII 编码值) ,你在那一层做if判断 就需要了解这一层接收到的到底是什么。明白整个过程就不会问这么傻的问题了。 新手还是要买仿真器才能调试,不然你没理论基础很多时候都寸步难行。    你的这个很简单建议你直接修改 中断函数 修改 fag的值,

// 截图是直修改 串口中断函数的 直接操作 led对应的IO 就行了,你用那个就要改成哪个截图的只是我的实际情况是用那个IO口 如果你串口中断改成截图的样子 那发送的就是 大写的 E 不能勾选 发送新行,
微信截图_20181002190622.jpg
回复

使用道具 举报

4

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2018-9-23
在线时间
67 小时
 楼主| 发表于 2018-10-2 20:53:11 来自手机 | 显示全部楼层
jaems 发表于 2018-10-2 19:12
1.单片机每次进入中断接收的一组数据是一个字节吗?
答:每次单片机串口只要有数据就会触发串口中断,所以 ...

嗯嗯,谢谢你写了这么多,看了你的解释,还是明白了一些东西,对于初学者我来说,或许一个非常简单的问题都要搞好久才能明白,感谢前辈些不吝赐教
回复

使用道具 举报

0

主题

109

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2018-9-2
在线时间
8 小时
发表于 2018-10-3 08:21:42 | 显示全部楼层
感谢楼主,帮助到了我
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2018-10-3
在线时间
1 小时
发表于 2018-10-3 16:59:57 | 显示全部楼层
jaems 发表于 2018-10-2 19:12
1.单片机每次进入中断接收的一组数据是一个字节吗?
答:每次单片机串口只要有数据就会触发串口中断,所以 ...

hi, 如果要改为接收一个字符串比如发送“LED on"来点亮LED,应该怎么修改代码。谢谢~
回复

使用道具 举报

0

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2016-6-1
在线时间
32 小时
发表于 2018-10-6 10:19:47 | 显示全部楼层
本帖最后由 xupc 于 2018-10-6 10:21 编辑
imwinter 发表于 2018-10-3 16:59
hi, 如果要改为接收一个字符串比如发送“LED on"来点亮LED,应该怎么修改代码。谢谢~

这就是C语言字符串操作的问题了,下面是我的某个程序的一部分。根据需要,还可以比较收到的字符串的某一位是什么来确定功能。多看看C语言的字符串拷贝、字符串比较,不分大小写字符串比较等函数。
这里面有个简单协议,如果是S表示命令起始位,如果是E表示命令信息传送完毕,比如"Sopen_beepE",也可以用其他协议或者无协议。

void USART3_IRQHandler(void)  
{
u8 rec_data;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //&frac12;&Oacute;&Ecirc;&Otilde;&Ouml;&ETH;&para;&Iuml;
  {
    rec_data =(u8)USART_ReceiveData(USART3);         //(USART1->DR) &para;&Aacute;&Egrave;&iexcl;&frac12;&Oacute;&Ecirc;&Otilde;&micro;&frac12;&micro;&Auml;&Ecirc;&yacute;&frac34;&Yacute;
        if(rec_data=='S')                              //&Egrave;&ccedil;&sup1;&ucirc;&Ecirc;&Ccedil;S&pound;&not;±í&Ecirc;&frac34;&Ecirc;&Ccedil;&Atilde;ü&Aacute;&icirc;&ETH;&Aring;&Iuml;&cent;&micro;&Auml;&AElig;&eth;&Ecirc;&frac14;&Icirc;&raquo;
    {
     uart_byte_count=0x01;
    }
   else if(rec_data=='E')                           //&Egrave;&ccedil;&sup1;&ucirc;E&pound;&not;±í&Ecirc;&frac34;&Ecirc;&Ccedil;&Atilde;ü&Aacute;&icirc;&ETH;&Aring;&Iuml;&cent;&acute;&laquo;&Euml;&Iacute;&micro;&Auml;&frac12;á&Ecirc;&oslash;&Icirc;&raquo;
    {
       if(strcmp("open_beep",(char *)receive_str)==0)    BEEP=1;     //·&auml;&Atilde;ù&AElig;÷&Iuml;ì
     else if(strcmp("close_beep",(char *)receive_str)==0)   BEEP=0;     //·&auml;&Atilde;ù&AElig;÷&sup2;&raquo;&Iuml;ì
      
     for(uart_byte_count=0;uart_byte_count<32;uart_byte_count++)   receive_str[uart_byte_count]=0x00;      
         uart_byte_count=0;
    }      
   else if((uart_byte_count>0)&&(uart_byte_count<=UART3_REC_NUM))
    {
       receive_str[uart_byte_count-1]=rec_data;
       uart_byte_count++;
    }                  
   }
}
回复

使用道具 举报

0

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2016-6-1
在线时间
32 小时
发表于 2018-10-6 10:22:43 | 显示全部楼层
keil里面代码粘贴出来的汉字注释是乱码不知道怎么解决
回复

使用道具 举报

4

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2018-9-23
在线时间
67 小时
 楼主| 发表于 2018-10-7 21:55:41 | 显示全部楼层
xupc 发表于 2018-10-6 10:19
这就是C语言字符串操作的问题了,下面是我的某个程序的一部分。根据需要,还可以比较收到的字符串的某一 ...

感谢分享
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2018-10-3
在线时间
1 小时
发表于 2018-10-19 18:07:50 | 显示全部楼层
xupc 发表于 2018-10-6 10:19
这就是C语言字符串操作的问题了,下面是我的某个程序的一部分。根据需要,还可以比较收到的字符串的某一 ...

thanks
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 10:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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