OpenEdv-开源电子网

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

两块开发板通过串口连接问题

[复制链接]

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-6-15 10:54:41 | 显示全部楼层 |阅读模式
10金钱
我想试一下两块开发板之间的通信,用了两块一样的板子。硬件连接:

板一通过外部5V电压供电,串口一与板二串口一连接(Rx-Tx,Tx-Rx,GND-GND)
板二通过J-link下载器供电(3.3V),串口二与USB-RS232转接线连接(Rx-Tx,Tx-Rx,GND-GND)


程序是:

板一在主循环延时1s通过串口一发送一串数据;
USART1_Printf("qwer");
板二在串口一中断函数里每接收到一个数据就通过串口二发出去:
void USART1_IRQHandler()
{
        u8 Res;

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                Res = USART_ReceiveData(USART1);       
                Uart2_SendData8(Res);
                USART_ClearFlag(USART1, USART_FLAG_RXNE);
        }
}


请问这样可行吗?

最佳答案

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

咋说呢,或许行。 Uart2_SendData8(Res) ,估计是等发送完成再退出。 发送是需要时间的,那么这段时间,就一直在中断服务程序里,死等。 问题来了: 假如板一的波特率比较高,而板二的UART2的波特率比较低, 板二发送一次的时间长,在此期间板一可能又有几个字节发过来, 那么,板二还在处理发送,等它发送完,板一的这几个字节已经过去了,板二就收不到,丢失了。 假如反过来,板一波特率比较低,板二比较高, 那么 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2018-6-15 10:54:42 | 显示全部楼层
本帖最后由 xuande 于 2018-6-15 11:33 编辑

咋说呢,或许行。

Uart2_SendData8(Res) ,估计是等发送完成再退出。
发送是需要时间的,那么这段时间,就一直在中断服务程序里,死等。

问题来了:
假如板一的波特率比较高,而板二的UART2的波特率比较低,
板二发送一次的时间长,在此期间板一可能又有几个字节发过来,
那么,板二还在处理发送,等它发送完,板一的这几个字节已经过去了,板二就收不到,丢失了。

假如反过来,板一波特率比较低,板二比较高,
那么在板二发送期间,板一没有数据过来,就不会有问题。


回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-15 11:36:48 | 显示全部楼层
xuande 发表于 2018-6-15 11:32
咋说呢,或许行。

Uart2_SendData8(Res) ,估计是等发送完成再退出。

波特率设置是一样的
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-15 11:38:51 | 显示全部楼层
xuande 发表于 2018-6-15 11:32
咋说呢,或许行。

Uart2_SendData8(Res) ,估计是等发送完成再退出。

我试了,不行
硬件这样连接没错吗?
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-6-15 11:40:05 | 显示全部楼层
可以,没问题。
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2018-6-15 11:40:56 | 显示全部楼层
试试看啊,又坏不了,怕什么。正常不能这么用的,串口接收要缓冲
我有故事,你有酒吗
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-15 11:44:03 | 显示全部楼层
HXYDJ 发表于 2018-6-15 11:40
可以,没问题。

试了,不行啊
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-15 11:45:55 | 显示全部楼层
来俩不甜的 发表于 2018-6-15 11:40
试试看啊,又坏不了,怕什么。正常不能这么用的,串口接收要缓冲

试过了,不行。缓冲也试过了。用数组接收发过来的数据,定义标志位。也是不行
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2018-6-15 11:48:29 | 显示全部楼层
qiuzhicheng 发表于 2018-6-15 11:45
试过了,不行。缓冲也试过了。用数组接收发过来的数据,定义标志位。也是不行

你贴出来的程序没问题的。看看硬件连接,找找看你没贴出来的程序是不是搞错了什么
我有故事,你有酒吗
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-15 11:52:21 | 显示全部楼层
        while(1)
        {
                k = key_scan();  //按键检测
                if(k)
                {
                        Uart1_SendData8(k);
                }
                n = Uart1_RevData8();   //不会阻塞
                Uart1_SendData8(n);     //发送给串口显示
               
                switch(n)
                {
                        case 1:GPIOB->ODR ^= 1<<8;break;  //led1取反
                        case 2:GPIOB->ODR ^= 1<<9;break;  //led2取反
                        default : break;
                }
        }


u8 Uart1_RevData8()  
{
        if(USART1->SR & 1<<5)
        {
                return USART1->DR;
        }
        return 0;       
}


这样也不行,好像两块板子没有联通,不能通信
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-15 11:56:32 | 显示全部楼层
来俩不甜的 发表于 2018-6-15 11:48
你贴出来的程序没问题的。看看硬件连接,找找看你没贴出来的程序是不是搞错了什么

单独试两块板的串口二都是没问题的,但是串口一没有接SP3232测试不来和电脑连接
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-15 11:57:38 | 显示全部楼层
这是串口部分的接口原理图
QQ图片20180615115319.png
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2018-6-15 12:37:17 | 显示全部楼层
应该是可以的,找找原因,为了节省时间,接收中断里面可以直接操作寄存器
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-15 13:30:34 | 显示全部楼层
d1z1y2 发表于 2018-6-15 12:37
应该是可以的,找找原因,为了节省时间,接收中断里面可以直接操作寄存器

嗯,我再看看
回复

使用道具 举报

6

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-4-27
在线时间
48 小时
发表于 2018-6-15 15:19:51 | 显示全部楼层
这个逻辑过程貌似有点问题,1.应该是 串口一中断函数处理接收,接收完成,通过串口二发送,清除串口一的接收标志,等待下一次接收触发;
2. Uart2_SendData8(Res); USART_ClearFlag(USART1, USART_FLAG_RXNE);放到if语句的外面试一下,
3.并且if语句中应该要加接收等待完成的语句,毕竟接收也是需要时间的,
4.同时看一下,发送函数内部有没有 等待发送完成的判断
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-15 15:57:41 | 显示全部楼层
店小迩 发表于 2018-6-15 15:19
这个逻辑过程貌似有点问题,1.应该是 串口一中断函数处理接收,接收完成,通过串口二发送,清除串口一的接 ...

谢谢你给出的建议
1.这个方法也试过了,测试没用
2.我在if前面加了关闭LED灯的程序,测试led没用关闭。即没用进入串口一中断函数
3.if这个判断语句不就是是否接收到数据吗
4.这是串口二发送函数,串口一类似(换成串口一寄存器)
void Uart2_SendData8(u8 Data)
{
        while (!(USART2->SR & 1<<6))  
        {
                ;                           
        }
  USART2->DR = Data;            
}
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-19 08:35:39 | 显示全部楼层
都说可以,怎么就是不行呢
回复

使用道具 举报

6

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-4-27
在线时间
48 小时
发表于 2018-6-19 13:46:53 | 显示全部楼层
qiuzhicheng 发表于 2018-6-15 15:57
谢谢你给出的建议
1.这个方法也试过了,测试没用
2.我在if前面加了关闭LED灯的程序,测试led没用关闭。 ...

串口中断都没有进入,要么硬件连接不成功,要么板一的发送没有成功,建议你一步一步来,首先确定你的电路板有没有问题,然后测试你的软件功能,串口一,串口二能不能正常发送接收,然后再测你的逻辑,最好看看你的开发板是什么类型,看看你的开发板的参考手册,串口一串口二的说明,看看你在使用时他们的引脚有没有被占用的等问题。  
把问题拆分,一步一步测,不要急
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-19 16:26:18 | 显示全部楼层
店小迩 发表于 2018-6-19 13:46
串口中断都没有进入,要么硬件连接不成功,要么板一的发送没有成功,建议你一步一步来,首先确定你的电路 ...

嗯嗯,谢谢,我再看看
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 00:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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