OpenEdv-开源电子网

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

求助 串口转发数据时有时无

[复制链接]

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-11-4
在线时间
27 小时
发表于 2016-11-4 17:55:17 | 显示全部楼层 |阅读模式
2金钱
void USART2_IRQHandler(void)
{          
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
        {         

                USART_SendData(USART1, USART_ReceiveData(USART2) );        //Debug 有时候会出现不输出数据的现象
               
                USART2_RX_BUF[USART2_REC_num] = USART_ReceiveData(USART2);  //接收字符存入 BUF
                USART2_REC_num ++;
                if( USART2_REC_num > USART2_MAX_REC_LEN )       
                        USART2_REC_num = 0;
        }                                                                                                                            
}   
非常简单的一个 串口2接收数据转发到 串口1.
问题就出在 USART_SendData(USART1, USART_ReceiveData(USART2) );        //Debug 有时候会出现不输出数据的现象
但最奇怪的是 buf 中却有数据,也就是说 串口2接收数据是正常的.但确没有转发出来.
求解, 有检查中断优先级 串口2的优先级高于串口1
串口1 只接收数据,通过串口调试助手查看. 10次 会有 1-2次能输出.

最佳答案

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

感谢大家的热情帮助,问题解决了.不是程序问题,刚刚从测试部门借了个示波器查看发现 RX 引脚,发送数据前后都是低电平,只有数据发送的时候会是高.外接上拉电阻后问题解决.只是非常奇怪 为何会出现这样的现象.有待进一步深究,至于串口数据在芯片不同接口间转发,我个人觉得,只要波特率与中断控制的合理这不是问题的. 例如我的 串口 2将数据转发给串口1 串口2的中断优先级必须高于串口1,波特率 串口1的必须高与串口2.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-11-4
在线时间
27 小时
 楼主| 发表于 2016-11-4 17:55:18 | 显示全部楼层
感谢大家的热情帮助,问题解决了.不是程序问题,刚刚从测试部门借了个示波器查看发现 RX 引脚,发送数据前后都是低电平,只有数据发送的时候会是高.外接上拉电阻后问题解决.只是非常奇怪 为何会出现这样的现象.有待进一步深究,至于串口数据在芯片不同接口间转发,我个人觉得,只要波特率与中断控制的合理这不是问题的. 例如我的 串口 2将数据转发给串口1 串口2的中断优先级必须高于串口1,波特率 串口1的必须高与串口2.
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2908
金钱
2908
注册时间
2016-5-13
在线时间
184 小时
发表于 2016-11-4 20:21:28 | 显示全部楼层

看的我头晕……
中断嵌套……哥……你别这么玩好不……
没有见过你这样写的。
你可以把USART_SendData(USART1, USART_ReceiveData(USART2_RX_BUF[x]) );   ---这个处理放到main的while里去。
在main的whlie里检查 当uart2空闲的时候再在用串口1发送。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-11-5 12:52:26 | 显示全部楼层
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
你有没有等待串口去发送这些数据?
回复

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-11-4
在线时间
27 小时
 楼主| 发表于 2016-11-7 10:07:50 | 显示全部楼层
电脑小白 发表于 2016-11-4 20:21
看的我头晕……
中断嵌套……哥……你别这么 ...

BUF 中数据是在 main的while 处理,我的问题不是说 BUF中收不到数据,而是 转发串口1 有时无法发送.buf 中始终能正确接收所有数据.
回复

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-11-4
在线时间
27 小时
 楼主| 发表于 2016-11-7 10:16:28 | 显示全部楼层
footprint 发表于 2016-11-5 12:52
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
你有没有等待串口去发送这些数据?

加上  传输完成标准判断也是一样的, 问题依旧. 刚刚有把程序放到战舰上测试是正常的. 我设备的芯片型号是STM32F101RB,难道是芯片问题. 希望有那个兄弟能指正一下.
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-11-7 10:29:31 | 显示全部楼层
楼主很主要的一个问题,在中断里面做一些鸟事情,不出问题才怪呢
回复

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-11-4
在线时间
27 小时
 楼主| 发表于 2016-11-7 11:46:00 | 显示全部楼层
憨厚诚实大叔 发表于 2016-11-7 10:29
楼主很主要的一个问题,在中断里面做一些鸟事情,不出问题才怪呢

void USART2_IRQHandler(void)
{          
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
        {         
                USART_SendData(USART1, USART_ReceiveData(USART2) );               

               
//                USART2_RX_BUF[USART2_REC_num] = USART_ReceiveData(USART2);//接收字符存入 BUF
//                USART2_REC_num ++;
//                if( USART2_REC_num > USART2_MAX_REC_LEN )        //判断写入的位置计数值大于了buf 的大小 计数值 = 0 从头写过 buf
//                        USART2_REC_num = 0;
        }                                                                                                                            
}   
问题是这一件时间他都做不好,时有时无.
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-11-7 12:20:43 | 显示全部楼层
为什么非要把发数据放里面。你有没有考虑过上传数据还没发出去,你就又往里面写数据了。
在接收同时不判断标志位直接发数据就是一个问题了
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-11-7 12:28:03 | 显示全部楼层
不对,准确说,在中断里面直接转发数据本身就是一个很大的问题,你拿什么保证数据转发能跟得上接受
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2016-11-8 13:13:05 | 显示全部楼层
通信部分,建议做成异步方式,而不是同步~同步在大数量数据通信会有掉帧的可能
回复

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-11-4
在线时间
27 小时
 楼主| 发表于 2016-11-10 11:46:29 | 显示全部楼层
小陀螺爱炒蛋 发表于 2016-11-8 13:13
通信部分,建议做成异步方式,而不是同步~同步在大数量数据通信会有掉帧的可能

非常感谢, 串口数据转发我只有在Debug的时候使用,主要是为了方便查看程序接收到了些什么.
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2016-12-15 20:17:57 | 显示全部楼层
楼主串口转发实现大数据量了吗?
回复

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-11-4
在线时间
27 小时
 楼主| 发表于 2016-12-21 11:58:52 | 显示全部楼层
ssssssssssss 发表于 2016-12-15 20:17
楼主串口转发实现大数据量了吗?

不知道你要多大.
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2016-12-21 16:26:00 | 显示全部楼层

我已经实现了,谢谢
回复

使用道具 举报

0

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-12-12
在线时间
10 小时
发表于 2016-12-21 21:49:00 | 显示全部楼层
是不是输出模式的问题
回复

使用道具 举报

0

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-12-12
在线时间
10 小时
发表于 2016-12-21 21:49:22 | 显示全部楼层
设置一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 10:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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