OpenEdv-开源电子网

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

串口问题请教

[复制链接]

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-6-14 09:56:06 | 显示全部楼层 |阅读模式
10金钱
如果有两块开发板通过串口一相连,板一会不断发数据给板二(数据长度未知,结束字符未知),板二通过串口二与电脑连接(串口的波特率都为2400).

现在想把板一发给板二的数据显示在串口助手上,程序如下:

void USART1_IRQHandler()
{
        u8 Res;

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


这样可行吗?

最佳答案

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

首先得设置两块板子的主从关系,这样单片机才有主次之分,个人建议与电脑进行串口的作为主机,另外一个作为从机。 下面就可以考虑逻辑顺序和时序的关系。主要是考虑缓存的读取和发送问题,要读取板一发送的信息,只需要把板二的接受板一缓存区的数据读出来,然后将读取的数据发送出去。 如果你怕出错,你可以在板一发给板二数据之后,将板二与板一的接受置位接受忙碌,禁止通信;等将板一发给板二的数据发送给电脑后,再置位允许 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2018-4-4
在线时间
21 小时
发表于 2018-6-14 09:56:07 | 显示全部楼层
首先得设置两块板子的主从关系,这样单片机才有主次之分,个人建议与电脑进行串口的作为主机,另外一个作为从机。
下面就可以考虑逻辑顺序和时序的关系。主要是考虑缓存的读取和发送问题,要读取板一发送的信息,只需要把板二的接受板一缓存区的数据读出来,然后将读取的数据发送出去。
如果你怕出错,你可以在板一发给板二数据之后,将板二与板一的接受置位接受忙碌,禁止通信;等将板一发给板二的数据发送给电脑后,再置位允许接受,开始再次通信。(这样的做法会让通信变慢)
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2018-6-14 10:07:18 | 显示全部楼层

接收 USART1 的部分差不多。
但要考虑 USART2 是不是空闲。

回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-14 10:16:34 | 显示全部楼层
xuande 发表于 2018-6-14 10:07
接收 USART1 的部分差不多。
但要考虑 USART2 是不是空闲。

是要考虑串口2发数据有没有发送完成吗?
在中断里面啊,要发送完成才会再一次进入中断吧
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-14 10:27:44 | 显示全部楼层
还有一个问题就是:板一是通过串口一不断发数据给板二的(发数据间隔时间未知),第二次数据会不会打断第一次数据的传输?
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2018-6-14 11:08:20 | 显示全部楼层
qiuzhicheng 发表于 2018-6-14 10:16
是要考虑串口2发数据有没有发送完成吗?
在中断里面啊,要发送完成才会再一次进入中断吧


1 和 2 共用一个中断吗?


回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2018-6-14 11:09:20 | 显示全部楼层
qiuzhicheng 发表于 2018-6-14 10:27
还有一个问题就是:板一是通过串口一不断发数据给板二的(发数据间隔时间未知),第二次数据会不会打断第一 ...


所以,你要保证前一个字节发送完成,再发送下一个字节。

回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-6-14
在线时间
1 小时
发表于 2018-6-14 12:42:33 | 显示全部楼层
串口2发送要等待发送完,串口1结束中断需要清除中断标志位
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-14 13:34:09 | 显示全部楼层
xuande 发表于 2018-6-14 11:08
1 和 2 共用一个中断吗?

不是啊,串口一、二都有中断函数,不过串口二只发送数据
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-14 13:37:29 | 显示全部楼层
xuande 发表于 2018-6-14 11:09
所以,你要保证前一个字节发送完成,再发送下一个字节。

串口一中断函数是:串口一接收一个字节,就进入一次中断函数,在中断函数中通过串口二把串口一接收到的数据发出来。
我的意思是:串口一中断不会打断自己正在执行的中断程序吧?
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-14 13:46:38 | 显示全部楼层
陌陌12131 发表于 2018-6-14 12:42
串口2发送要等待发送完,串口1结束中断需要清除中断标志位

串口2发送函数里有等待发送完成,串口的清除中断标志位一般是读取USARTx->DR寄存器的值就行吗?不行我就加一句USART_ClearFlag(USART1, USART_FLAG_RXNE);

还有我想问:清除中断标志位意味着结束中断吗?那是不是清除之后,即使程序还在中断函数中运行,也还是会像正常程序一样被(任意)中断打断
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 11:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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