OpenEdv-开源电子网

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

两个板子串口通信,再显示至LCD

[复制链接]

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2020-3-21
在线时间
21 小时
发表于 2020-3-22 00:28:07 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 林中明月间 于 2020-3-22 07:54 编辑

1.器材:STM32F1*1(发送),STM32F4*1+LCD(接收)2.总体思路:F1板子获得内部温度传感器的温度值,比用外接模块还简单一点,直接使用例程Get_Temprate()即可获得温度。F1通过串口3发送该值至F4的串口3,在F4连接的LCD上进行显示。
3.问题描述:因为这个是每次获取发送单个short型值,但是需要循环发送,确保更新,所以可能有所不同吧。F1获得温度值肯定是没问题的,printf打印到串口1可以显示温度值。F1对于串口3发送,参考论坛上的代码,用数组存储发送。接收端使用USART3_RX_STA判断,USART3_RX_BUF[]接收,就是将原子的usart.c复制修改成串口3了。仿真里,F1发送过后,F4的USART3_RX_STA没有判断到接收到数据,LCD相应也不能显示数值。
4.注:(1)我觉得是发送的时候格式不对或者接受的时候判断不到结束符,但是加上\r\n(即0x0d 0x0a结束符)USART3_RX_STA还是没有判断成功。(2)接线应该是没问题,收发反接,共地。(3)可能F4自己也有温度传感器这样有点折腾,但是以后还可以发送别的数据,主要是想知道出问题的地方。使用的是uart协议。(4)文件名称:F1串口为发送方代码,F4串口为接收方代码。然后我再放两张F1与F4初始化的代码截图。参考了论坛上几个类似的帖子与代码,还是没有解决,所以才来发帖求助,希望大家不吝赐教。

发送端

发送端

接收端主函数

接收端主函数

接收端接收中断

接收端接收中断
串口(F4).zip (6.7 MB, 下载次数: 7)

最佳答案

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

先调通你的F4的串口功能吧,可以正常收发之后,再调试你的后面的功能
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5140
金钱
5140
注册时间
2014-8-26
在线时间
1317 小时
发表于 2020-3-22 00:28:08 | 显示全部楼层
先调通你的F4的串口功能吧,可以正常收发之后,再调试你的后面的功能
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2020-3-21
在线时间
21 小时
 楼主| 发表于 2020-3-23 17:04:24 | 显示全部楼层
在审核的时候自己又尝试了一下,串口收发好像没有什么问题...论坛上参考的方法是可行的,也可以打印到LCD上,也感谢楼上的回复。但是问题现在变成接收端接收到数值为ascii码值。比如温度值是21.33.按照发送方式,接收端就会为E .33。小数部分两位都不会超过10,对于16进制和10进制是一样的。但是整数部分发送时是16进制的0x45,接收端在转换的时候变为ascii码中的E显示出来,所以我在发送的时候发送temp[1]为空就是想然让接收端数组可以把整数E转换为两位,显示出来。
对于接收端我是自己写了一个转换的代码,不过好像不起作用。不知道是哪出现点问题还是我方法不对。
刚才请教原子技术支持,让我采用sprintf方法,现在再试试。
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2020-3-21
在线时间
21 小时
 楼主| 发表于 2020-3-23 17:42:02 | 显示全部楼层
接收的转换代码(有问题):
  1. if(USART3_RX_STA&0x8000)/*串口是否接受到数据*/
  2.         {
  3. //                                                int num=(USART3_RX_BUF[0]-0x30)/10*16+(USART3_RX_BUF[0]-0x30)%10;
  4. //                                                USART3_RX_BUF[0]=num/10;
  5. //                                                USART3_RX_BUF[1]=num%10;
  6.                                                 USART3_RX_BUF[USART3_RX_STA&0X3FFF]=0;/*在串口数据的最后加入结束位 0就代表字符结束*/
  7.             LCD_Fill(30,86,300,16,WHITE);/*清空显示区域*/
  8.             LCD_ShowString(35,86,300,270,16,USART3_RX_BUF);/*显示数据*/
  9.             USART3_RX_STA=0;/*清空标志位  方便串口下次接收*/
  10.         }
  11.                         RTC_ShowTime(x);        //实时时钟显示函数
复制代码
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2020-3-21
在线时间
21 小时
 楼主| 发表于 2020-3-23 20:00:31 | 显示全部楼层
问题已经解决。方法是不使用数组一位一位传,这样会导致以上说的进制的问题,还要转换回来,我还没做出来,麻烦看出问题或者解决方法的可以告诉我一下,多谢了。
后来采用的方法是技术支持兄弟说的sprintf,大概原理就是将所要传递的值放进一个数组,类似于这样:
  1. sprintf((char*)p,"temprate is %d.%d%d",temp/100,(temp%100)/10,temp%10);
复制代码
,发送的时候建议修改使用以下printf函数,
  1. printf("%s C\r\n",(char*)p);
复制代码
;对于使用USART_SendData()传递还不是特别清楚。然后接收的开发板就可以直接使用USART3_RX_BUF[]直接显示了。
上面是我的一点理解,如果有错误或者可以解决我的疑惑,还希望大家不吝赐教。
回复

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2020-3-24 08:55:19 | 显示全部楼层
林中明月间 发表于 2020-3-23 17:42
接收的转换代码(有问题):

你先搞清楚串口所发送的数据类型,然后把你要发的数据转换为串口所发送的数据类型,再发送,接收端对接收到的数据进行解码,逆转换回原来的数据类型
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2020-3-21
在线时间
21 小时
 楼主| 发表于 2020-3-24 12:55:08 | 显示全部楼层
liaohaijian 发表于 2020-3-24 08:55
你先搞清楚串口所发送的数据类型,然后把你要发的数据转换为串口所发送的数据类型,再发送,接收端对接收 ...

嗯嗯。硬件仿真里senddata的每一位数据是按是16进制的ascii码值发送的,接收一端直接变成10进制对应ascii码显示的。
回复

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2020-3-25 10:43:04 | 显示全部楼层
林中明月间 发表于 2020-3-24 12:55
嗯嗯。硬件仿真里senddata的每一位数据是按是16进制的ascii码值发送的,接收一端直接变成10进制对应ascii ...

那转换一下不就可以了吗
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2020-3-21
在线时间
21 小时
 楼主| 发表于 2020-3-25 13:04:13 | 显示全部楼层
liaohaijian 发表于 2020-3-25 10:43
那转换一下不就可以了吗

嗯嗯 对
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 15:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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