OpenEdv-开源电子网

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

精英STM32F103利用485与串口助手通讯

[复制链接]

12

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1330
金钱
1330
注册时间
2020-1-10
在线时间
131 小时
发表于 2020-12-4 09:43:27 | 显示全部楼层 |阅读模式
20金钱
我想利用精英开发板的485实现与串口助手的通讯,所以在提供的例程上进行修改,可是修改后串口助手收到的都是方框和乱码,同样的修改在探索者407上却可以实现,各位大佬们知道为什么吗?程序在下面附上
主程序
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
//#include "lcd.h"
#include "usart.h"         
#include "rs485.h"


/************************************************
ALIENTEK精英STM32开发板实验24
485 实验
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/
                                        
int main(void)
{         
        u8 key;
        u8 i=0,t=0;
        u8 cnt=0;
        u8 rs485buf[5];
         
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                                  //初始化与LED连接的硬件接口
        KEY_Init();                                //按键初始化                          
        RS485_Init(9600);        //初始化RS485       
                                                                          
        while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY0_PRES)//KEY0按下,发送一次数据
                {

                                rs485buf[0]=cnt++;//填充发送缓冲区
                                printf("%d\r\n",rs485buf[0]);
                          RS485_Send_Data(rs485buf,5);//发送5个字节                        
                }                 
                RS485_Receive_Data(rs485buf,&key);
                if(key)//接收到有数据
                {
                        if(key>5)key=5;//最大是5个数据.
                }
                t++;
                delay_ms(10);
                if(t==20)
                {
                        LED0=!LED0;//提示系统正在运行       
                        t=0;

                }                  
        }
}

printf函数的调用已经从usart.c转移到rs485.c并改为usart2,其余代码没有再修改,485波特率已改为9600

最佳答案

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

我是说重定向fputc函数 你的485重定向: int fputc(int ch, FILE *f) { while((USART2->SR&0X40)==0);//循环发送,直到发送完毕 USART2->DR = (u8) ch; return ch; } 我的485重定向: int fputc(int ch, FILE *f) { GPIO_SetBits(GPIOB, GPIO_Pin_2); /* 释放总线2 */ #if 0 comSendChar(COM2, ch); return ch; #else USART_SendData(USART2, (uint8_t) ch); /* 等待发送结束 */ ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2020-10-24
在线时间
57 小时
发表于 2020-12-4 09:43:28 | 显示全部楼层
ae13665 发表于 2020-12-7 19:56
发送rs485buf是因为不能写rs485buf【0】,否则编译出错。至于使能,程序里也定义了使能端口PD7,也有#ifd ...

我是说重定向fputc函数
你的485重定向:
int fputc(int ch, FILE *f)
{      
        while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
    USART2->DR = (u8) ch;      
        return ch;
}
我的485重定向:
int fputc(int ch, FILE *f)
{
        GPIO_SetBits(GPIOB,  GPIO_Pin_2); /* 释放总线2 */
#if 0       
        comSendChar(COM2, ch);

        return ch;
#else       
        USART_SendData(USART2, (uint8_t) ch);
        /* 等待发送结束 */
        while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
        {}
        GPIO_ResetBits(GPIOB,  GPIO_Pin_2); /* 释放总线2 */
        return ch;
#endif
}

看出区别了么兄弟,每一次发送都需要改变使能管脚的电平,参考你程序里的RS485_Send_Data函数,人家每次发送都这么做。
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14401
金钱
14401
注册时间
2018-8-3
在线时间
1156 小时
发表于 2020-12-4 11:04:11 | 显示全部楼层
是板子 485另外接一个485转USB 连接电脑的么
回复

使用道具 举报

12

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1330
金钱
1330
注册时间
2020-1-10
在线时间
131 小时
 楼主| 发表于 2020-12-4 14:03:53 | 显示全部楼层
翼行园子 发表于 2020-12-4 11:04
是板子 485另外接一个485转USB 连接电脑的么

是的,精英版485连接485转USB,再接电脑
回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2020-10-24
在线时间
57 小时
发表于 2020-12-4 15:16:31 | 显示全部楼层
串口波特率和485波特率不一样么。。。依稀记得原子的F103是SP3485串口转485输出的,485速率还能单独修改么
回复

使用道具 举报

12

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1330
金钱
1330
注册时间
2020-1-10
在线时间
131 小时
 楼主| 发表于 2020-12-4 19:14:01 | 显示全部楼层
gjwhs 发表于 2020-12-4 15:16
串口波特率和485波特率不一样么。。。依稀记得原子的F103是SP3485串口转485输出的,485速率还能单独修改么

例程里就是不一样的,一个115200,一个9600
回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2020-10-24
在线时间
57 小时
发表于 2020-12-5 09:40:50 | 显示全部楼层
ae13665 发表于 2020-12-4 19:14
例程里就是不一样的,一个115200,一个9600

嗯。。。代码在别的板子上能用。首先确认下PC端波特率跟代码里的一致,然后确认时钟频率
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
发表于 2020-12-5 16:23:23 | 显示全部楼层
方框和乱码,极有可能就是波特率初始化问题,串口助手设置对的波特率,还有16进制显示这些
回复

使用道具 举报

12

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1330
金钱
1330
注册时间
2020-1-10
在线时间
131 小时
 楼主| 发表于 2020-12-6 19:33:41 | 显示全部楼层
gjwhs 发表于 2020-12-5 09:40
嗯。。。代码在别的板子上能用。首先确认下PC端波特率跟代码里的一致,然后确认时钟频率

是探索者F407和精英F103都有485通讯的例程,对各自例程的主函数和RS485.c采用相同的改动,探索者通讯成功,精英版出现乱码。103和407在485上有什么不同吗?
回复

使用道具 举报

12

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1330
金钱
1330
注册时间
2020-1-10
在线时间
131 小时
 楼主| 发表于 2020-12-6 19:36:03 | 显示全部楼层
笨鸟想飞 发表于 2020-12-5 16:23
方框和乱码,极有可能就是波特率初始化问题,串口助手设置对的波特率,还有16进制显示这些

程序是例程,波特率两边都是9600,尝试过其他波特率也是无效
回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2020-10-24
在线时间
57 小时
发表于 2020-12-7 13:49:10 | 显示全部楼层
ae13665 发表于 2020-12-6 19:33
是探索者F407和精英F103都有485通讯的例程,对各自例程的主函数和RS485.c采用相同的改动,探索者通讯成功 ...

https://blog.csdn.net/aizaiyueye ... FromBaidu-1.control
参考下这个看
回复

使用道具 举报

12

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1330
金钱
1330
注册时间
2020-1-10
在线时间
131 小时
 楼主| 发表于 2020-12-7 13:54:34 | 显示全部楼层
gjwhs 发表于 2020-12-7 13:49
https://blog.csdn.net/aizaiyueye/article/details/79049816?utm_medium=distribute.pc_relevant.none-t ...

好的,感谢
回复

使用道具 举报

12

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1330
金钱
1330
注册时间
2020-1-10
在线时间
131 小时
 楼主| 发表于 2020-12-7 14:11:57 | 显示全部楼层
gjwhs 发表于 2020-12-7 13:49
https://blog.csdn.net/aizaiyueye/article/details/79049816?utm_medium=distribute.pc_relevant.none-t ...

不行,按照这个方法修改后,不仅原本的问题没有解决,而且之前可以正常读数的USB转串口也收到乱码了
回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2020-10-24
在线时间
57 小时
发表于 2020-12-7 14:38:28 | 显示全部楼层
ae13665 发表于 2020-12-7 14:11
不行,按照这个方法修改后,不仅原本的问题没有解决,而且之前可以正常读数的USB转串口也收到乱码了

当然不能完全照着人家文章改,人家外部晶振是12Mhz的,你要是8M的那不是越改越错嘛
回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2020-10-24
在线时间
57 小时
发表于 2020-12-7 14:39:18 | 显示全部楼层
ae13665 发表于 2020-12-7 14:11
不行,按照这个方法修改后,不仅原本的问题没有解决,而且之前可以正常读数的USB转串口也收到乱码了

直接上工程看看
回复

使用道具 举报

12

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1330
金钱
1330
注册时间
2020-1-10
在线时间
131 小时
 楼主| 发表于 2020-12-7 15:06:13 | 显示全部楼层
gjwhs 发表于 2020-12-7 14:39
直接上工程看看

这是工程压缩包

实验24 485实验.rar

2.48 MB, 下载次数: 34

回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2020-10-24
在线时间
57 小时
发表于 2020-12-7 16:30:47 | 显示全部楼层
ae13665 发表于 2020-12-7 15:06
这是工程压缩包

为什么你主函数里不断给rs485buf[0]赋值,然而输出的RS485_Send_Data(rs485buf,5);发送了一整个数组。另外你这个printf重定向改成了串口2是没错,但是485要printf是需要使能的,原子的电路也不是自动收发的,结果就是printf根本没发出去。
回复

使用道具 举报

12

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1330
金钱
1330
注册时间
2020-1-10
在线时间
131 小时
 楼主| 发表于 2020-12-7 19:56:24 | 显示全部楼层
gjwhs 发表于 2020-12-7 16:30
为什么你主函数里不断给rs485buf[0]赋值,然而输出的RS485_Send_Data(rs485buf,5);发送了一整个数组。另 ...

发送rs485buf是因为不能写rs485buf【0】,否则编译出错。至于使能,程序里也定义了使能端口PD7,也有#ifdef EN_USART2_RX  #endif使能语句
回复

使用道具 举报

12

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1330
金钱
1330
注册时间
2020-1-10
在线时间
131 小时
 楼主| 发表于 2020-12-7 21:34:29 | 显示全部楼层
gjwhs 发表于 2020-12-7 16:30
为什么你主函数里不断给rs485buf[0]赋值,然而输出的RS485_Send_Data(rs485buf,5);发送了一整个数组。另 ...

按道理讲对于485,F1和F4应该没有太大差别,正点原子的485讲解视频中也说F1和F4通用,我分别在探索者和战舰的485例程上做相同的修改,探索者的485就可以正常读数,战舰的是乱码,就很奇怪
回复

使用道具 举报

12

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1330
金钱
1330
注册时间
2020-1-10
在线时间
131 小时
 楼主| 发表于 2020-12-9 14:53:18 | 显示全部楼层
gjwhs 发表于 2020-12-8 14:31
我是说重定向fputc函数
你的485重定向:
int fputc(int ch, FILE *f)

看懂了,感谢大哥,修改后成功运行。
回复

使用道具 举报

2

主题

47

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2022-4-23
在线时间
7 小时
发表于 2022-4-25 22:09:18 | 显示全部楼层
485jiushichuankou
回复

使用道具 举报

2

主题

47

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2022-4-23
在线时间
7 小时
发表于 2022-4-25 22:26:10 | 显示全部楼层
heheheheheheheh
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-28 05:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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