OpenEdv-开源电子网

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

miniSTM32F103开发板串口二通信怎么办?

[复制链接]

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
发表于 2019-2-21 10:49:39 | 显示全部楼层 |阅读模式
1金钱
由于课程设计需要,我们需要用到串口2,的PA2,PA3引脚,可是串口二不能通信,同样的情况下,我们用串口一能够通信,而且我是用STM32CUBEMX生成的。

最佳答案

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

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-2-21 10:49:40 | 显示全部楼层
高梨康治sia 发表于 2019-2-22 17:03
串口2也可以实现吗?可以发过来看一下,邮箱

正常实现

MINI 串口2自发自收(PA2接RXD,PA3接TXD).rar

1.86 MB, 下载次数: 148

回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-21 11:35:17 | 显示全部楼层
定义
uint8_t aRxBuffer;                        //接收中断缓冲
uint8_t Uart2_RxBuff[256];                //接收缓冲
uint8_t Uart2_Rx_Cnt = 0;                //接收缓冲计数
uint8_t        cAlmStr[] = "数据溢出(大于256)\r\n";
回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */

        if(Uart2_Rx_Cnt >= 255)  //溢出判断
        {               
                Uart2_Rx_Cnt = 0;
                memset(Uart2_RxBuff,0x00,sizeof(Uart2_RxBuff));  
                HAL_UART_Transmit(&huart2, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);       
        }
        else
        {
                Uart2_RxBuff[Uart2_Rx_Cnt++] = aRxBuffer;   //接收数据转存
                if((Uart2_RxBuff[Uart2_Rx_Cnt-1] == 0x0A)&&(Uart2_RxBuff[Uart2_Rx_Cnt-2] == 0x0D)) //判断结束位
                {       
                        printf("\r\n您发送的消息为:\r\n");
                        HAL_UART_Transmit(&huart2, (uint8_t *)&Uart2_RxBuff, Uart2_Rx_Cnt,0xFFFF); //将收到的信息发送出去
                        Uart2_Rx_Cnt = 0;
                        memset(Uart2_RxBuff,0x00,sizeof(Uart2_RxBuff)); //清空数组
                }
        }
        HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7571
金钱
7571
注册时间
2016-11-30
在线时间
643 小时
发表于 2019-2-21 14:53:01 | 显示全部楼层
1.看串口设置。2.看时钟设置,尤其是SystemClock_Config()函数。
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-2-21 15:04:53 | 显示全部楼层
一定要CUBEMx生成的代码吗?我这边倒是有不用CUBEMX的测试代码
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2019-2-21 15:22:44 | 显示全部楼层
没有使用过HAL库,可以用官方库或者寄存器,使能时钟,配置串口GPIO引脚,中断,等等,原子这里有例程,可以参考一下
回复

使用道具 举报

3

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
434
金钱
434
注册时间
2013-3-18
在线时间
82 小时
发表于 2019-2-21 17:12:40 | 显示全部楼层
高梨康治sia 发表于 2019-2-21 11:35
定义
uint8_t aRxBuffer;                        //接收中断缓冲
uint8_t Uart2_RxBuff[256];                //接收缓冲

你写的不太规范啊,接收完成回调函数,传入的串口句柄参数,你怎么使用UNUSED?需要用传入的参数判断是不是当前的串口。再一个就是在中断中使用发送函数也是不合理的,因为你所使用的是阻塞式的发送,会导致中断不能及时退出。至于你说的不能通讯的问题,可以使用单步调试,看看是否进入接收中断了。接收中断都不进,说明是线路的问题或者是串口配置的问题。
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-21 17:14:22 | 显示全部楼层
lvkanger 发表于 2019-2-21 14:53
1.看串口设置。2.看时钟设置,尤其是SystemClock_Config()函数。

这个是通过是STM32cube生成的代码 串口配置和时钟配置这些应该不存在问题,不过提供了思路,我可以去检查一下
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-21 17:21:58 | 显示全部楼层
holy404290384 发表于 2019-2-21 17:12
你写的不太规范啊,接收完成回调函数,传入的串口句柄参数,你怎么使用UNUSED?需要用传入的参数判断是不 ...

我是参考这一篇文章的,https://blog.csdn.net/cayloon/article/details/79196942其中我用其中的办法能实现串口1的通讯,而后不能实现串口二,主要是MINISTM32的串口的TXD,RXD不是接在PCB上的,而且,我需要在串口二的TXD,RXD上接入ESP8266,所以必须用到除串口一之外的串口
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-22 08:44:28 | 显示全部楼层
测试这个串口的时候,在主函数里面添加上 printf("ceshi");在串口助手上都不可以看到。
我借鉴的重定向printf函数:
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
int _sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
    USART2->DR = (uint8_t) ch;      
        return ch;
}
#endif
为什么连printf都不行啊
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-22 10:08:58 | 显示全部楼层
顶一下
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-22 17:03:34 | 显示全部楼层
本帖最后由 高梨康治sia 于 2019-2-22 17:08 编辑
peng1554 发表于 2019-2-21 15:04
一定要CUBEMx生成的代码吗?我这边倒是有不用CUBEMX的测试代码

串口2也可以实现吗?可以发过来看一下,邮箱w2319223464@163.com
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-22 17:04:18 | 显示全部楼层
这就是通过STM32cube生成的,可以看一下

WIFI_Test_1.rar

3.71 MB, 下载次数: 22

串口2

回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-23 10:29:04 | 显示全部楼层

可是下载下去依然没有现象啊 是不是硬件连接端还要做些什么啊 PA2,PA3引脚还需要做什么吗?

下载成功

下载成功

效果图

效果图

程序源码

程序源码
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-23 10:31:55 | 显示全部楼层

其中硬件连接端还要做些什么嘛?怎么我下载下去没有现象  我以前没有接触过硬件方面的知识?
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-2-23 12:21:24 | 显示全部楼层
高梨康治sia 发表于 2019-2-23 10:31
其中硬件连接端还要做些什么嘛?怎么我下载下去没有现象  我以前没有接触过硬件方面的知识?

USB线接1处和电脑USB, 2处的RXD接PA2  TXD接PA3.然后板子上电,再去在电脑端设置波特率为9600
MINIV3_1.png
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-23 12:43:40 | 显示全部楼层
peng1554 发表于 2019-2-23 12:21
USB线接1处和电脑USB, 2处的RXD接PA2  TXD接PA3.然后板子上电,再去在电脑端设置波特率为9600

喔 意思是说还要一根TTL线把他们连接起来是吧 谢谢大佬
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-2-23 12:55:47 | 显示全部楼层
高梨康治sia 发表于 2019-2-23 12:43
喔 意思是说还要一根TTL线把他们连接起来是吧 谢谢大佬

需要的线有USB线和杜邦线
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-23 13:02:11 | 显示全部楼层
peng1554 发表于 2019-2-23 12:55
需要的线有USB线和杜邦线

是的 已经可以了 主要是没有连接TXD和RXD接到PA2,PA3;之前是让两个引脚空着的
回复

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-2-18
在线时间
11 小时
 楼主| 发表于 2019-2-23 13:03:17 | 显示全部楼层
完成了目标 再次感谢
peng1554,holy404290384,lvkanger,245925587这几位
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2020-3-6
在线时间
5 小时
发表于 2020-4-21 16:11:16 | 显示全部楼层
peng1554 发表于 2019-2-23 12:21
USB线接1处和电脑USB, 2处的RXD接PA2  TXD接PA3.然后板子上电,再去在电脑端设置波特率为9600

你好,请问这个2处的RXD是接自己板子的PA2还另一块板子的PA2呢
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2020-7-3
在线时间
2 小时
发表于 2020-9-6 08:50:41 | 显示全部楼层
peng1554 发表于 2019-2-23 12:21
USB线接1处和电脑USB, 2处的RXD接PA2  TXD接PA3.然后板子上电,再去在电脑端设置波特率为9600

我用了您上边帖子里的程序,下载好了之后按照这个接线方式接好之后我的串口调试助手仍然是没反应是怎么回事?
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-12-1
在线时间
5 小时
发表于 2020-12-2 22:18:30 | 显示全部楼层
peng1554 发表于 2019-2-23 12:21
USB线接1处和电脑USB, 2处的RXD接PA2  TXD接PA3.然后板子上电,再去在电脑端设置波特率为9600

请问 如果我使用蓝牙模块 蓝牙的rx、tx连了板子的tx、rx  那我该怎么通信呢?
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-12-1
在线时间
5 小时
发表于 2020-12-2 22:26:03 | 显示全部楼层
那如果需要有外接模块连板子上的rx tx怎么办  就不能通信了吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 06:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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